web-dev-qa-db-ja.com

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

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

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

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

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

10
Yoni

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

彼の素晴らしい提案された解決策については、ここでReinの答えを確認してください(そして彼に投票してください):

タイプ 'System.DBNull'のオブジェクトをタイプ 'System.String`にキャストできません

8
Davide Piras

ExecuteScalarは、DBNullからnull値の場合はqueryを返し、結果がない場合はnullを返します。たぶん、開発サーバーでは発生しませんでした(nullqueryの結果です)。

18
Piotr Auguscik

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

ISNULL(check_expression、replacement_value)

すなわち.。

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

2
Chris Catignani