web-dev-qa-db-ja.com

DataRowアイテムをnullに設定する

データテーブルに読み込んだテキストファイルがあり、SQLServerテーブルに一括挿入します。これは非常に高速で、インポートされたすべての値が文字列として扱われる場合にうまく機能します(日付、文字列、intなどはすべて文字列フィールドにインポートされます)。

概念が完成したので、データベースとコードに実際のデータ型を割り当てることに戻ります。データベースには、フィールドに割り当てられた正しいタイプがあります。私は今コードに取り組んでいます。

日付に問題があります。前述したように、すべてが文字列であり、正しい型に変換されます。次のコードでは、日付を表す文字列値がnullまたは空白であるかどうかをテストします。 nullでない場合は、既存の値を使用します。それ以外の場合は、nullに設定します。

_row[i] = !string.IsNullOrWhiteSpace(data[i]) ? data[i] : DBNull.Value;
_

nullを使用しようとしましたが、代わりにDBNullを使用するように指示するエラーが表示されます。 DBNullを使用すると、文字列と_System.DBNull_の間に暗黙の変換がないことを通知するメッセージが表示されます。

データテーブルの列にはデータ型が指定されており(この場合はDataType = Type.GetType("System.DateTime"))、この列に_AllowDBNull = true_を設定しました

これをどのように処理しますか?

ありがとう!

13
DenaliHardtail

問題は、使用している操作が原因です。 DBNull.Valueは文字列ではないため、条件演算子は使用できません。これは、 条件演算子docs から:

First_expressionとsecond_expressionのタイプが同じであるか、あるタイプから別のタイプへの暗黙的な変換が存在する必要があります。

これを試してください:

if (!string.IsNullOrWhiteSpace(data[i]))
    row[i] = data[i];
else
    row[i] = DBNull.Value;

これにより、両側が同じになるための変換要件がバイパスされます。または、両方をSystem.Objectに明示的にキャストし、条件演算子を使用することもできます。

16
Reed Copsey

次のようなオブジェクトに両方をキャストする必要があります。

row[i] = !string.IsNullOrWhiteSpace(data[i]) ? (object)data[i] : (object)DBNull.Value;
8
Shane Andrade

私はAsp.NetMVC 5 C#Webアプリケーションに取り組んでおり、このようにして問題なく動作しました

rw[6] = (qry.PODate != null) ? qry.PODate : (object)DBNull.Value;
2
RAVI VAGHELA

NULLのみをチェックする場合は、次の構文を使用することもできます。

row[i] = (object)data[i] ?? DBNull.Value;
0
MAXE