SqlDataAdapter 填充 returns 异常

SqlDataAdapter Fill returns exception

服务器端:

ALTER PROCEDURE [dbo].[POS_STORED_OBJECTS_GET_SP]
    @STORE_ID nvarchar(8)
    ,@TERMINAL_ID nvarchar(8)
    ,@OBJECT_ID bigint
AS

客户端:

SqlParameter storeID = new SqlParameter("@STORE_ID", SqlDbType.NVarChar);
storeID.Direction = ParameterDirection.Input;
storeID.Value = Properties.storeId;
SqlParameter termanalID = new SqlParameter("@TERMINAL_ID", SqlDbType.NVarChar);
termanalID.Direction = ParameterDirection.Input;
termanalID.Value = null;
SqlParameter objectID = new SqlParameter("@OBJECT_ID", SqlDbType.BigInt);
objectID.Direction = ParameterDirection.Input;
objectID.Value = null;  

SqlConnection connection = new SqlConnection(Properties.сonnectionString);
SqlCommand command = new SqlCommand("POS_STORED_OBJECTS_GET_SP", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(storeID);
command.Parameters.Add(termanalID);
command.Parameters.Add(objectID);  

SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;  

DataSet dataSet = new DataSet();
adapter.Fill(dataSet);

最后,adapter.Fill抛出异常:

Procedure or function 'POS_STORED_OBJECTS_GET_SP' expects parameter '@TERMINAL_ID', which was not supplied

我做错了什么?

不要使用 null 作为参数值,而是尝试使用 System.DBNull.Value.

您必须设置 termanalID.Value = DBNull.Value 而不是 null。

DBNull.Value用于发送一个NULL值作为参数的值。

您可以使用null或不设置Value 属性来使用参数的默认值,但是由于您没有在存储过程中指定任何默认值- 在您的特定情况下,它没有任何意义。

objectID 参数相同的故事。

参考MSDN

您还可以在数据库端将一些参数的默认值设置为空。这样您就不必在客户端创建无用的参数。

服务器端:

    ALTER PROCEDURE [dbo].[POS_STORED_OBJECTS_GET_SP]
    @STORE_ID nvarchar(8)
    ,@TERMINAL_ID nvarchar(8) = null
    ,@OBJECT_ID bigint = null
    AS

客户端:

SqlParameter storeID = new SqlParameter("@STORE_ID", SqlDbType.NVarChar);
storeID.Direction = ParameterDirection.Input;
storeID.Value = Properties.storeId;

SqlConnection connection = new SqlConnection(Properties.сonnectionString);
SqlCommand command = new SqlCommand("POS_STORED_OBJECTS_GET_SP", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(storeID);

SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;  

DataSet dataSet = new DataSet();
adapter.Fill(dataSet);