ExecuteScalarはnullまたはDBNull(開発サーバーまたは本番サーバー)を返します。

私はC#の既存の DataRow に列を追加しようとしています。その後、データベースの1つの値で列が埋められます。

DataRow drが既に存在し、列「COLNAME」も存在します。
comTBPは私の SqlCommand です。

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());

これは、データベースに値があり、ExecuteScalar()がその値を取得できる場合は、すべて正常に動作します。このコードを自分の開発サーバー(ローカル)でテストすると、ExecuteScalar()がnullまたはDBNullを返し、新しい列の値が0の場合でも機能します。ただし、コードを運用サーバーに展開すると問題が発生します。同じデータベースを使って同じことをすべて実行すると、DBNullをInt32に変換できないというメッセージが表示された例外がスローされます。
私の質問は、なぜこのエラーはプロダクションサーバーに現れ、私のローカル開発サーバーには表示されないのですか?

9
おそらく、生産と開発に関する異なるデータです。
追加された 著者 leppie,

3 答え

ExecuteScalar returns DBNull for null value from query and null for no result. Maybe on your development server it never occured (null result from query).

18
追加された

明らかに実稼働環境では、コマンド実行から返された NULL か、接続文字列の中で何か異なるものがあります。原則として、 ExecuteScalar の結果を直接別の型にキャスト/変換する前に、DBNullをテストする必要があります。

Reinの答えをチェックして(彼に投票する)

Unable to cast object of type 'System.DBNull' to type 'System.String`

7
追加された
その後、彼はすべての真実を言っていないか、あなたが間違っています;-)私は過去に同様の問題を抱えていましたが、変換/キャストの前に常にDBNULLをチェックすることで解決しました
追加された 著者 Davide Piras,
C#のAFAIKヌルはDbNull.Valueではありません!!
追加された 著者 Davide Piras,
接続文字列、.NETバージョン、サービスパック、dbドライバ、OS、すべてのすべてが同じもので、同じ正確なSQL Serverマシンとデータベース、テーブルとストアドプロシージャに接続していますか?どこか違いがあるはずです! Release vs Debugビルド....?とにかく私は上記の答えの中でこれをどう扱うかについての解決策を持っています。
追加された 著者 Davide Piras,
はい、あなたは常にnullとDBNullをチェックする必要があります... Int32に変換するときだけでなく、結果のオブジェクトを使用する前に
追加された 著者 Davide Piras,
nullConvert.ToInt32 は0になります。
追加された 著者 Piotr Auguscik,
戻り値:valueに等しい32ビット符号付き整数。値がNothingの場合はゼロ。
追加された 著者 Piotr Auguscik,
私はそれが生産でNULLを返すことを知っている..それは同じDBのため、開発でNULLを返します。私の質問は、開発時にNULLを返し、本番環境で DBNull を返す理由でした。開発時にNULLからInt32へのキャストは0になりますが、本番ではDBNullからInt32へのキャストを試み、例外をスローします
追加された 著者 Yoni,
私は知っている...そしてそれは私の質問ですか?開発では、returnはNULLであり、プロダクションリターンではDBNullです。
追加された 著者 Yoni,
私はあなたがバージョンで言うような問題だと思う。開発はWindows 7、プロダクションはWindows Server 2008 R2です。 Release vs Debugは私のローカルPCでリリースされたバージョンを試していて、接続文字列が同じSQL Serverマシンと同じであるため問題にはなりません。私は私の唯一の(そして最も安全な)解決策は、上記のような方法を使用し、DBNullまたはNULL値をチェックすることだと思います。
追加された 著者 Yoni,

SQLでISNULL()関数を使用します。

ISNULL(check_expression、replacement_value)

つまり...

SELECT ISNULL(SUM(Price)、0) FROM Order

2
追加された