字符串或二进制数据将被截断。该语句已终止。不明白为啥? [复制]

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时提示 ‘将截断字符串或二进制数据。 语句已终止’ 。如何找到被截断数据或字段。

sqlserver插入语句报“将截断字符串或二进制数据”怎么解决,怎么回事?

SQLException : 字符串或二进制数据将被截断

sql server,将截断字符串或二进制数据,如何知道出错在哪个字段?