【问题标题】:Error: String or binary data would be truncated. The statement has been terminated错误:字符串或二进制数据将被截断。该语句已终止
【发布时间】:2013-03-19 09:51:22
【问题描述】:

我正在尝试创建一个简单的注册表单,将来自文本框等的数据输入到名为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()

我收到此错误消息:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    或者更好的是,当您构建表单时,为与表中的列匹配的表单字段指定MaxLength。如果您的表格只能容纳 20 个字符,为什么还要让用户输入超过 20 个字符?

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

    【讨论】:

    • 如果字符串长度小于字段长度,则 nvarchar 占用的内存更少
    【解决方案2】:

    您在表中插入的字符串数据比您在表中存储它的列的大小更大。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-31
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多