Передача null в DataTable из однострочного условного оператора при разборе строковых значений - PullRequest
16 голосов
/ 07 марта 2011

У меня есть приложение, которое просматривает текстовый файл фиксированной ширины, считывает каждую строку в строковую переменную и использует метод .Substring () для поиска данных для данного поля.Для заданного поля он проверяет, является ли содержимое просто пробелами или в нем действительно есть «данные», то есть что-нибудь, кроме пробелов.Если есть данные, и эти данные представляют, например, дату, тогда DateTime.Parse () запускается для этих данных и передается в поле типа datetime в C # DataTable;однако, если нет данных - только пробелы, я хочу просто передать нулевое значение в поле.Вот фрагмент кода, чтобы проиллюстрировать:

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')

Что мне здесь не хватает?

Ответы [ 2 ]

36 голосов
/ 07 марта 2011

Вам нужно разыграть DateTime до object, чтобы использовать его в условном выражении:

dr["Application_Date"] = (...) ? (object)DateTime.Parse(...) : DBNull.Value;
4 голосов
/ 05 октября 2018

Использование оператора слияния нуль:

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