web-dev-qa-db-ja.com

文字列値を解析する1行の条件ステートメントからDataTableにnullを渡す

固定幅のテキストファイルをループし、各行を文字列変数に読み込み、.Substring()メソッドを使用して特定のフィールドのデータを検索するアプリがあります。特定のフィールドについて、コンテンツが単なるスペースであるかどうか、または実際に「データ」が含まれているかどうか、つまりスペース以外のものであるかどうかを確認します。たとえば、データがあり、そのデータが日付を表す場合、DateTime.Parse()がそのデータに対して実行され、C#DataTableのdatetime型のフィールドに渡されます。ただし、データがなく、スペースだけの場合は、単にnull値をフィールドに渡します。説明するコードのスニペットは次のとおりです。

var dataTable = new DataTable();

dataTable.Columns.Add("Application_Date").DataType = Type.GetType("System.DateTime");

while (!sr.EndOfStream)
{
    string row = sr.ReadLine();

    if (row.Substring(0, 1) == "2" && row.Substring(42, 1) == "T")
    {
        DataRow dr = dataTable.NewRow();

        dr["Application_Date"] = row.Substring(124, 8) != "        " ?
                                 DateTime.Parse(row.Substring(124, 4) +
                                 "-" + row.Substring(128, 2) + "-" +
                                 row.Substring(130, 2)) :
                                 null as DateTime?;                                                         

     }
}

私の問題は、これを実行しようとすると、DBNullが必要であるというエラーがスローされることです(Cannot set Column 'Application_Date' to be null. Please use DBNull instead.

しかし、代わりにDBNullを単純に渡そうとすると、DateTimeとDBNullの間で変換できないことがわかります(Type of conditional expression cannot be determined because there is no implicit conversion between 'System.DateTime?' and 'System.DBNull'

ここで何が欠けていますか?

17
Tom Miller

条件付きで使用するには、DateTimeobjectにキャストする必要があります。

dr["Application_Date"] = (...) ? (object)DateTime.Parse(...) : DBNull.Value;
40
SLaks

Null合体演算子の使用:

dr["Application_Date"] = (object)nullableDateTime ?? DBNull.Value;
7
Saeb Amini