对象引用未设置为对象的实例由DBNull.Value引起

时间:2010-07-12 18:48:40

标签: c# .net ado.net

SqlCommand objsql = new SqlCommand();
.
.
objsql.Parameters.AddWithValue("@Param1", DBNull.Value);
.
.
.

我收到了一个特殊的错误:

“对象引用未设置为对象的实例”

如果我这样做:

objsql.Parameters.AddWithValue("@PaymentMethodID", null);

我收到以下错误: 参数化查询'(@SupplierQuoteID int,@ PaymentMethodID nvarchar(4000),@ DueDate d'需要参数'@PaymentMethodID',这是未提供的。“}

PaymentMethodID是表中的一列,取空值。

此错误发生在此处:

string valHolder = null;
valHolder = objSqlCommand.ExecuteScalar().ToString(); 
singleValue = Convert.ToInt32(valHolder);

一旦objSqlCommand.ExecuteScalar()。ToString();执行时,抛出错误。 记录被插入到表中但是ExecuteScalar()不会返回任何记录 值!它应该返回当前最新的自动递增的pk,但它不会。

注意:执行此行时会抛出我上面提到的所有错误

valHolder = objSqlCommand.ExecuteScalar().ToString(); 

以下是完整错误:

System.NullReferenceException was caught
  Message="Object reference not set to an instance of an object."
  Source="........"
  StackTrace:
       at ......DAL.ExecuteSQL(SqlCommand sqlCmd, String typeOfExecution) in C:\Users\....\Desktop\........\DAL.cs:line 136
  InnerException: 

我该怎么办?

1 个答案:

答案 0 :(得分:6)

不要直接在ExecuteScalar()上调用ToString()。首先调用objSqlCommand.ExecuteScalar(),然后测试以查看该变量是否为空。这很可能就是发生的事情。

如果您正在调用存储过程,请确保Select SCOPE_IDENTITY()是您的sproc的最后一行,否则将不会返回最后一个自动编号。