【问题标题】:ADO.NET truncates binary data when passing it to TSQL stored procedures将二进制数据传递给 SQL 存储过程时,ADO.NET 截断了二进制数据
【发布时间】:2014-01-29 14:32:01
【问题描述】:

让我描述一下问题:

  1. 我有一个表T,其中有一列C,类型为NVARCHAR(100)
  2. 我有一个将数据插入T 的存储过程。它有参数@c nvarchar(100) NOT NULL
  3. 当我使用长度 > 100 的字符串参数从数据访问层调用此存储过程时,它会静默截断数据并且不会发生数据库错误。我想改用“字符串或二进制数据将被截断 SQL 错误”。

我尝试使用明确的 ADO.NET 方法(使用 command.Parameters.Add(...)command.Parameters.AddWithValue(...),甚至尝试指定 SqlParameter.Size = 100)和使用 EntLib 方法调用存储过程 - 结果相同。

如果我在存储过程中设置更大的参数大小,那么它会被传递到存储过程并发生数据库错误。将存储过程参数设置为@c nvarchar(MAX)是不是一个好办法?

【问题讨论】:

    标签: sql-server stored-procedures ado.net


    【解决方案1】:

    您确定只有 ADO.NET 会截断您的值吗?我认为存储过程也会截断您的值。

    为了证明这一点,我创建了一个简单的存储过程,它有一个输入参数 @test nvarchar(10),并使用 SELECT 语句输出相同的值:

    CREATE PROCEDURE testProcedure
      @test nvarchar(10)
    as
    BEGIN
        SELECT @test as result
    END
    

    如果您使用超过 10 的参数调用此过程,则字符串将被截断为 10 个字符:

    输入

    testProcedure '0123456789xxx'
    

    输出

    0123456789
    

    所以你的INSERT 不会抛出任何异常,因为它接收到的值已经被截断。

    因此,如果您想从您的过程中获得异常,您必须将未截断的值提供给您的 INSERT 语句。

    要实现这一点,您必须在存储过程中定义大于表中字段大小的参数,例如设置(如您所说)@c nvarchar(MAX)

    【讨论】:

    • 谢谢!我刚刚意识到我不需要 nvarchar(MAX) 参数,我可以使用 nvarchar(COLUMN_SIZE + 1) ,这在任何情况下都不允许静默截断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多