2016-10-30 11 views
1

私は各顧客(合計請求書)を計算するために以下のコードを使用しました。顧客には請求書がありません。エラーを返します。ヌルでエラーを処理しようとしましたが動作しません。ExecuteScalar()はエラーを返します "指定されたキャストは無効です。"レコードがないとき

public static decimal GetInvoiceTotal(int customerID) 
    { 
     SqlConnection connection = MMABooksDB.GetConnection(); 
     string selectStatement 
      = "SELECT SUM(InvoiceTotal) " 
      + "FROM Invoices " 
      + "WHERE CustomerID = @CustomerID"; 
     SqlCommand selectCommand = 
      new SqlCommand(selectStatement, connection); 
     selectCommand.Parameters.AddWithValue("@CustomerID", customerID); 




     try 
     { 
      connection.Open(); 

      if (selectCommand.ExecuteScalar()!=null) 
      { 
       decimal invoiceTotal = (decimal)selectCommand.ExecuteScalar(); 
       return invoiceTotal; 
      } 


      else 
      { 
       return 0; 
      } 
     } 
     catch (SqlException ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      connection.Close(); 
     } 
    } 
+0

10進数にキャストする理由はありますか?また、ExecuteScalarを1回だけ使用するようにコードを変更する必要があります。 –

+0

http://stackoverflow.com/questions/1999020/handling-executescalar-when-no-results-are-returned – TheRealVira

答えて

2

ExecuteScalarに2回も電話する必要はありません。広いストロークで

var value = selectCommand.ExecuteScalar(); 
if(value != DBNull.Value) 
{ 
    return (decimal)value; 
} 

更新

DBNullクラスは、非既存の値を表します。 nullとは異なります。これは、オブジェクトへの参照がないことを意味します。したがって、SQLクエリの結果がNULLの場合、ADO.NET(データベースへのアクセスに使用したテクノロジ)の値はDBNullです。

詳細については、hereをご覧ください。

+0

私はあなたの答えのように私のコードを変更しました、私はデバッグvarの値で{}チェックし、値!= null)、私はそれがどのように渡すかわからない(値!= null) – Masoud

+0

まだ動作しない場合、私は何を意味するかわからない値= {}、とnullではありません。 – Masoud

+0

@Masoudをデバッグするには、return文の前に 'var temp = value.ToString();'という文を追加し、 'temp'の値を教えてください。感謝 – Christos