Использование параметра Default в вызове хранимой процедуры

у меня есть следующая хранимая процедура

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

должен ли параметр, который переопределяет значение по умолчанию, передаваться по-другому?

3 ответов


new SqlParameter("@bar", 0) вызывает неправильную перегрузку -string parameterName, SqlDbType dbType. Значение в конечном итоге не устанавливается.

вы хотите тот, который устанавливает значение, так что это должно быть new SqlParameter("@bar", (object)0).

вот почему AddWithValue.


использовать

cmd.Parameters.AddWithValue("@bar", 0)

таким образом, вы знаете, что фактически передаете значение.


лучше и безопасным :

cmd.Parameters.Add("@bar", SqlDbType.NVarChar, 16, "bar");