在存储过程调用中使用默认参数

ojh*_*ins 8 c# sql t-sql sql-server stored-procedures

我有以下存储过程

CREATE PROCEDURE [dbo].[usp_GetData]
@foo VARCHAR (20), @bar bit = 1
AS ...
Run Code Online (Sandbox Code Playgroud)

这在SSMS中调用时提供了正确的结果.

EXEC dbo.usp_GetData @foo = 'Hellow World', @bar = 0
Run Code Online (Sandbox Code Playgroud)

虽然在C#应用程序中调用如下所示

cmd.Parameters.Add(new SqlParameter("@foo", foo)); 
cmd.Parameters.Add(new SqlParameter("@bar", 0));
Run Code Online (Sandbox Code Playgroud)

&由剖析器捕获,如下所示.

exec dbo.usp_GetData @foo=N'Hello World',@bar=default
Run Code Online (Sandbox Code Playgroud)

是否必须以不同方式传递超出默认值的参数?

GSe*_*erg 2

new SqlParameter("@bar", 0)触发错误的过载 - string parameterName, SqlDbType dbType。该值最终未被设置。

您想要设置该值的那个,所以它应该是new SqlParameter("@bar", (object)0).

这就是AddWithValue引入的原因。

  • @ojhawkins,你的参数是一个“位”,所以提供正确的数据类型总是一个好主意,而不是希望sql能够正确转换整数。 (2认同)