2011-11-08 4 views
0

SQLデータベースから値を返そうとしています。しかし、次のメソッドを実行するたびに、「InvalidCastExceptionが未処理です。オブジェクトをDBNullから他の型にキャストできません」というエラーが表示されます。SQLデータベースから単一の値を返すときにInvalidCastExceptionが発生する

これを流すことができる光は大変ありがたいです。私が使っている方法は以下の通りです。

ありがとうございました。

public static int ScrapTotal2(string prdTypeV, string startDateV, string prtCodeV) 
    { 
     int scrapTotal2; 

     SqlParameter prdType = new SqlParameter("@prdType", SqlDbType.VarChar); 
     prdType.Value = prdTypeV; 
     SqlParameter startDate = new SqlParameter("@startDate", SqlDbType.VarChar); 
     startDate.Value = startDateV; 
     SqlParameter prtCode = new SqlParameter("@prtCode", SqlDbType.VarChar); 
     prtCode.Value = prtCodeV; 

     SqlCommand scrapTotal2SC = new SqlCommand("SELECT SUM([QTY_SCRP]) FROM [TBL_PRDMST] WHERE [PRD_CODE] LIKE @prdType AND [PRD_DATE] = @startDate AND [PRT_CODE] LIKE @prtCode", DataAccess.myConnection); 
     scrapTotal2SC.Parameters.Add(prdType); 
     scrapTotal2SC.Parameters.Add(startDate); 
     scrapTotal2SC.Parameters.Add(prtCode); 

     DataAccess.myConnection.Open(); 
     scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar()); 
     DataAccess.myConnection.Close(); 

     return scrapTotal2; 
    } 
+0

のですか?まずDBをチェックインしてください。 – Pleun

+0

コードにアクセスしてデバッグすることはできますか?どのラインが例外を投げているのかを教えてもらえれば素晴らしいでしょう。 try-catchでメソッドコードを囲むと、役に立つ情報が得られます。 – AksharRoop

答えて

3

SELECTステートメントはNULL値を返します。あなたはそれが最初のnullであるかどうかを確認する必要があります。

object result = scrapTotal2SC.ExecuteScalar(); 
if (result == DBNull.Value) 
{ 
    /* write your code */ 
} 
else 
{ 
    scrapTotal2 = Convert.ToInt32(result); 
} 
+0

ありがとうございます。私は、合計が0で、nullではないと誤って推測しました。これはうまくいった。 – fanle

0

エラーメッセージが明確であるように思える - あなたのクエリは(.NETでDbNullされるであろう)nullを返します。

整数は値型であり、nullにはできません。Int32に変換することはできません。

DbNullの戻り値をチェックし、データレイヤーからデフォルト値を戻すか、クエリとデータベースをチェックしてnullが返されないようにします。

+0

しかしconvert.toInt32はnullを0に変換します... –

+1

@RoyiNamir - しかし、 'DbNull'を' 0'に変換しません。 'DbNull!= null'です。 – Oded

+0

@RoyiNamir - はい、 'null'を0に変換しますが、' DbNull'に変換しません。 – Polynomial

0

いくつかのSQLサーバーは、空のリストの合計がnullだと思うとない0だから、あなたは自分をintにヌルからの変換を処理する必要があります。クエリの結果を直接intに変換しません。

scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar()); 

あなたは、データベース内のNULLを取得し、それがキャストされます。

0

は、あなたが指定されていませんでしたので、私はこの行は問題があると仮定するつもりだscrapTotal2 = Convert.ToInt32(((string)scrapTotal2SC.ExecuteScalar()));

1

してみてくださいコード内のDBNullの型に変換します。このタイプはInt32にキャストできません。

あなたはこのようにそれを確認することができます。

var obj = scrapTotal2SC.ExecuteScalar() 
if (obj == DBNull.Value) 
{ 
    // whatever logic you want to handle nulls 
} else { 
    scrapTotal2 = Convert.ToInt32(obj); 
} 
+0

申し訳ありませんが、どのラインが問題を投げたかを忘れてしまいました。助けてくれてありがとう。 – fanle

0

戻り値はNULLであり、あなたが行うことができない... INT型変数に格納しようとしていることため、エラーメッセージがあります。

は、おそらくあなたが何ができるかはあなたの選択リターンNULLまたは有効な値はありません...

if(retval is null) then assign var = 0. 
+0

DBNullはnullと同じではないため、OPはretval == DBNullかどうかをチェックする必要があります。値 –

+0

実際、私は同じことを意味しますが、構文を収集することができず、したがってpsudeoコードで書かれています。 – Rahul

関連する問題