C#の既存のDataRow
に列を追加しようとしています。その後、列は私のデータベースからの単一の値で埋められます。
DataRow drはすでに存在し、列「COLNAME」も存在します。
comTBPは私のSqlCommand
です。
dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());
データベースに値があり、ExecuteScalar()がその値を取得できる場合、これはすべて正常に機能します。このコードを開発サーバー(ローカル)でテストすると、ExecuteScalar()がnullまたはDBNullを返し、新しい列の値が0の場合にも機能します。ただし、コードを運用サーバーにデプロイすると問題が発生します。同じデータベースですべてを同じように実行すると、DBNullをInt32に変換できないというメッセージとともに例外がスローされます。
私の質問は、なぜこのエラーがローカル開発サーバーではなく本番サーバーに表示されるのですか?
明らかに、本番環境では、コマンドの実行からNULL
が返されるか、接続文字列などで何か別のものが返されます。原則として、ExecuteScalar
の結果を別のタイプに直接キャスト/変換する前に、常にDBNullをテストする必要があります。
彼の素晴らしい提案された解決策については、ここでReinの答えを確認してください(そして彼に投票してください):
ExecuteScalar
は、DBNull
からnull値の場合はquery
を返し、結果がない場合はnull
を返します。たぶん、開発サーバーでは発生しませんでした(null
はquery
の結果です)。
SQLでISNULL()関数を使用します。
ISNULL(check_expression、replacement_value)
すなわち.。
SELECT ISNULL(SUM(Price)、0)FROM Order