11

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

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

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

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

4

3 に答える 3

19

ExecuteScalarDBNull結果がない場合はnull値をquery返しますnull。たぶんあなたの開発サーバーではそれは決して起こらなかった(nullからの結果query)。

于 2011-10-28T09:27:46.933 に答える
10

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

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

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

于 2011-10-28T09:15:35.253 に答える
2

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

ISNULL(check_expression、replacement_value)

すなわち..。

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

于 2014-09-25T11:51:03.590 に答える