错误:字符串或二进制数据将被截断。该语句已终止

时间:2013-03-28 19:37:07

标签: asp.net sql-server database vb.net sql-server-2012

我正在尝试创建一个简单的注册表单,其中来自文本框等的数据被输入到名为users的表中:

user_id     int
username    nchar(20)
password    nchar(20)
... more columns

代码:

Dim Username As String = txtUsername.ToString
... more variable declarations

lblDOB.Text = DOB.ToString
lblDOB.Visible = True

Dim ProjectManager As String = "test"
... more constant declarations

Dim conn As New SqlConnection("...conn string...")

sqlComm = "INSERT INTO users(Username, Password, ...other columns...)" +
    "VALUES(@p1, @p2, ...other params...)"

conn.Open()
registerSQL = New SqlCommand(sqlComm, conn)
registerSQL.Parameters.AddWithValue("@p1", Username)
... other AddWithValues

registerSQL.ExecuteNonQuery()

我收到此错误消息:

  

字符串或二进制数据将被截断。声明已经终止。

3 个答案:

答案 0 :(得分:7)

是的,您允许人们输入的任何旧字符串。您需要将每个参数限制为该列中允许的最大长度。例如,如果您不想要错误,可以将用户名截断为20个字符,或者当参数值超过20个字符时,您可以引发自己的错误。截断你可以简单地说:

Dim Username As String = txtUsername.ToString.Substring(0,20)

或者更好的是,在构建表单时,请为表格字段指定MaxLength,以匹配表格中的列。如果您的表只设计为20?

,为什么让用户输入超过20个字符?

除此之外,nchar对于大多数此类数据来说是一个糟糕的数据选择,除非用户名,密码等总是正好是20个字符。您应该强烈考虑nvarchar

答案 1 :(得分:1)

您正在表格中插入字符串数据,该表格的大小超过您将其存储在表格中的列的大小。

也就是说,您将Username传递给大小超过20个字符的数据库。

答案 2 :(得分:0)

请将nchar(20)更改为varchar(50)