字符串或二进制数据将被截断。该语句已终止。不明白为啥? [复制]
Posted
技术标签:
【中文标题】字符串或二进制数据将被截断。该语句已终止。不明白为啥? [复制]【英文标题】:String or binary data would be truncated. The statement has been terminated. Can`t understand why? [duplicate]字符串或二进制数据将被截断。该语句已终止。不明白为什么? [复制] 【发布时间】:2018-09-27 22:32:06 【问题描述】:我知道这个问题,我在网上搜索过。我知道当我的值长度大于 SQL Server 表中定义的长度时会抛出这个异常。
这是我的 C# 代码:
using (SqlCommand cmdInsertUser = new SqlCommand("INSERT INTO [Accounts] VALUES (@username, @password, @email, @fullname, @money, @active, @activationCode, @registrationDate);", con))
Random random = new Random();
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
activationCode = (Enumerable.Repeat(chars, 6).Select(s => s[random.Next(s.Length)]).ToArray()).ToString();
con.Open();
cmdInsertUser.Parameters.AddWithValue("@username", txtSignUpUsername.Text);
cmdInsertUser.Parameters.AddWithValue("@password", txtSignUpPassword.Text);
cmdInsertUser.Parameters.AddWithValue("@email", txtSignUpEmail.Text);
cmdInsertUser.Parameters.AddWithValue("@fullname", txtSignUpFullName.Text);
cmdInsertUser.Parameters.AddWithValue("@money", Convert.ToInt32(txtSignUpMoney.Text));
cmdInsertUser.Parameters.AddWithValue("@active", 0);
cmdInsertUser.Parameters.AddWithValue("@activationCode", activationCode);
cmdInsertUser.Parameters.AddWithValue("@registrationDate", DateTime.Now.ToShortDateString());
cmdInsertUser.ExecuteNonQuery();
con.Close();
这是我的 SQL Server 表结构:
CREATE TABLE [dbo].[Accounts]
(
[Id] INT IDENTITY (1, 1) NOT NULL,
[Username] VARCHAR(12) NOT NULL,
[Password] VARCHAR(15) NOT NULL,
[Email] VARCHAR(50) NOT NULL,
[FullName] VARCHAR(50) NOT NULL,
[Money] INT NOT NULL,
[Active] BIT NOT NULL,
[ActivationCode] VARCHAR(6) NOT NULL,
[RegistrationDate] VARCHAR(50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
我输入的值:
用户名 = daniel7 密码 = 123456 Email = da************16@email.com(我的真实邮件是给出的,而不是*) 全名 = Daniel Ohayon 钱=0 活动 = 0 ActivationCode = 随机的 6 个字符 RegistrationDate = DateTime.Now.ToShortDateString()请帮助我!
【问题讨论】:
我认为问题可能出在您的 Active 列上。如果上面的链接没有(请参阅第二个答案)***.com/questions/22155483/…,其他问题可能会有所帮助 停止懒惰。不要使用addwithvalue。此外,您的插入语句更加懒惰。始终为插入语句指定列列表。为什么?因为有人可能会更改顺序,而某些人可能会在以后添加列。让我们避免可能不必要的额外工作。实际上定义你的参数可能会解决你的问题。 而且RegistrationDate列不应该是varchar!!!应该是date或者datetime2(精度合适)。 您确定激活码传递了 6 个字符。设置断点并检查? @hatchet 感谢您的回复。我读了这个问题,不幸的是他们没有帮助我。我什至尝试将 Active 列从 bit 更改为 int 并插入 0,它给出了相同的异常...:\ 还有其他建议吗? 【参考方案1】:我觉得你的问题源于这行代码:
activationCode = (Enumerable.Repeat(chars, 6).Select(s => s[random.Next(s.Length)]).ToArray()).ToString();
这将返回项目的名称,因为这是一个数组对象,而不是您可能期望的六位数字符数。
您可以尝试使用:
activationCode = new string(Enumerable.Repeat(chars, 6).Select(s => s[random.Next(s.Length)]).ToArray())
改为。
【讨论】:
以上是关于字符串或二进制数据将被截断。该语句已终止。不明白为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server (0x80131904):字符串或二进制数据将被截断 [重复]
SQL sever 中的警告“将截断字符串或二进制数据 语句已终止” 是啥意思啊? 我是刚学这个的?懂的帮帮我
把表A 数据插入表B时提示 ‘将截断字符串或二进制数据。 语句已终止’ 。如何找到被截断数据或字段。