24

固定幅のテキスト ファイルをループし、各行を文字列変数に読み取り、.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')

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

4

2 に答える 2

46

条件で使用するには、 DateTimetoをキャストする必要があります。object

dr["Application_Date"] = (...) ? (object)DateTime.Parse(...) : DBNull.Value;
于 2011-03-07T18:37:26.363 に答える