2010-07-12 64 views
2
SqlCommand objsql = new SqlCommand(); 
. 
. 
objsql.Parameters.AddWithValue("@Param1", DBNull.Value); 
. 
. 
. 

我得到一个特殊的错误引起的对象的实例:对象引用未设置为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,但它不会。

注:

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: 

我该怎么办:当执行

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

这是完全错误此行中我上面已经提到的所有错误抛出?

+0

objSqlCommand.ExecuteScalar()是什么值? – empi 2010-07-12 18:54:49

+0

什么sql语句可以有参数等于null,你可以告诉我你的选择语句或类似的东西? – 2010-07-12 18:54:51

+0

正如Jeremy(下图)和Waleed(上图)所示,似乎你的C#很好,问题在于你的SQL。 – 2010-07-12 19:08:07

回答

6

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

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

+1

已修复。 sql语句必须是: INSERT INTO SupplierInvoice(SupplierQuoteID,PaymentMethodID,DueDate)VALUES(@SupplierQuoteID,@PaymentMethodID,@DueDate); SELECT SuInvoiceID FROM SupplierInvoice WHERE SuInvoiceID = @@ IDENTITY – 2010-07-13 11:54:38

+0

我相信这样也会起作用,而且更简单。 INSERT INTO SupplierInvoice(SupplierQuoteID,PaymentMethodID,DueDate)VALUES(@SupplierQuoteID,@PaymentMethodID,@DueDate); SELECT @@ IDENTITY – Jeremy 2010-07-13 14:27:22

+0

不可以。SELECT @@ IDENTITY无效,但SELECT SuInvoiceID FROM SupplierInvoice WHERE SuInvoiceID = @@ IDENTITY。 – khany 2014-05-17 11:33:40

相关问题