我有以下存储过程
CREATE PROCEDURE [dbo].[usp_GetData]
@foo VARCHAR (20), @bar bit = 1
AS ...
在SSMS中调用时,这提供了正确的结果。
EXEC dbo.usp_GetData @foo = 'Hellow World', @bar = 0
虽然在C#应用程序中按以下方式调用
cmd.Parameters.Add(new SqlParameter("@foo", foo));
cmd.Parameters.Add(new SqlParameter("@bar", 0));
&安培;由剖析器捕获如下。
exec dbo.usp_GetData @foo=N'Hello World',@bar=default
是否必须以不同方式传递超出默认值的参数?
答案 0 :(得分:4)
使用
cmd.Parameters.AddWithValue("@bar", 0)
这样你就知道你实际传递了这个值。
答案 1 :(得分:2)
new SqlParameter("@bar", 0)
会触发错误的重载 - string parameterName, SqlDbType dbType
。该值最终未设置。
你想要设置值的那个,所以它应该是new SqlParameter("@bar", (object)0)
。
这就是AddWithValue
被引入的原因。
答案 2 :(得分:0)
更好,更安全:
cmd.Parameters.Add("@bar", SqlDbType.NVarChar, 16, "bar");