将二进制数据传递给TSQL存储过程时,ADO.NET会截断二进制数据

时间:2014-01-29 14:32:01

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

让我来描述一下这个问题:

  1. 我的表格T包含C类型的列NVARCHAR(100)
  2. 我有一个将数据插入T的存储过程。它有参数@c nvarchar(100) NOT NULL
  3. 当我从数据访问层调用此存储过程时,字符串参数长度为> 100,它默默地截断数据,不会发生数据库错误。我想得到'字符串或二进制数据将被截断SQL错误'而不是。
  4. 我尝试使用明确的ADO.NET方法调用存储过程(使用command.Parameters.Add(...)command.Parameters.AddWithValue(...),甚至尝试指定SqlParameter.Size = 100)并使用EntLib方法 - 同样的结果。

    如果我在存储过程中设置了更大的参数大小,则会将其传递给存储过程并发生数据库错误。将存储过程参数设置为@c nvarchar(MAX)是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分: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)