让我来描述一下这个问题:
T
包含C
类型的列NVARCHAR(100)
。T
的存储过程。它有参数@c nvarchar(100) NOT NULL
。 我尝试使用明确的ADO.NET方法调用存储过程(使用command.Parameters.Add(...)
或command.Parameters.AddWithValue(...)
,甚至尝试指定SqlParameter.Size = 100
)并使用EntLib方法 - 同样的结果。
如果我在存储过程中设置了更大的参数大小,则会将其传递给存储过程并发生数据库错误。将存储过程参数设置为@c nvarchar(MAX)
是一个很好的解决方案吗?
答案 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)