データテーブルに読み込んだテキストファイルがあり、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
_を設定しました
これをどのように処理しますか?
ありがとう!
問題は、使用している操作が原因です。 DBNull.Value
は文字列ではないため、条件演算子は使用できません。これは、 条件演算子docs から:
First_expressionとsecond_expressionのタイプが同じであるか、あるタイプから別のタイプへの暗黙的な変換が存在する必要があります。
これを試してください:
if (!string.IsNullOrWhiteSpace(data[i]))
row[i] = data[i];
else
row[i] = DBNull.Value;
これにより、両側が同じになるための変換要件がバイパスされます。または、両方をSystem.Object
に明示的にキャストし、条件演算子を使用することもできます。
次のようなオブジェクトに両方をキャストする必要があります。
row[i] = !string.IsNullOrWhiteSpace(data[i]) ? (object)data[i] : (object)DBNull.Value;
私はAsp.NetMVC 5 C#Webアプリケーションに取り組んでおり、このようにして問題なく動作しました
rw[6] = (qry.PODate != null) ? qry.PODate : (object)DBNull.Value;
NULLのみをチェックする場合は、次の構文を使用することもできます。
row[i] = (object)data[i] ?? DBNull.Value;