Передача null в DataTable из однострочного условного оператора при разборе строковых значений
У меня есть приложение, которое просматривает текстовый файл с фиксированной шириной, читает каждую строку в строковую переменную и использует метод.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 ответа
Вам нужно разыграть DateTime
в object
использовать его в условном выражении:
dr["Application_Date"] = (...) ? (object)DateTime.Parse(...) : DBNull.Value;
Используя нуль-объединяющий оператор:
dr["Application_Date"] = (object)nullableDateTime ?? DBNull.Value;