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);
服务器端:
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);