2011-02-25 90 views
9

我有一个文本文件,我读入数据表,然后执行批量插入到SQL Server表中。它非常快速,当所有导入的值都视为字符串(日期,字符串,整数等全部导入到字符串字段中)时,它非常有用。设置DataRow项目为空

现在我已经理解了这个概念,现在我回头在数据库和代码中分配真实的数据类型。数据库具有分配给这些字段的正确类型。我正在处理代码。

我遇到日期问题。正如我所提到的,一切都是一个字符串并被转换为正确的类型。在下面的代码中,我想测试表示日期的字符串值是否为空或空白。如果它不为空,则使用现有值。否则,将其设置为空。

row[i] = !string.IsNullOrWhiteSpace(data[i]) ? data[i] : DBNull.Value; 

我尝试使用null但得到一个错误,告诉我使用DBNull来代替。当我使用DBNull时,我收到一条消息,告诉我字符串和System.DBNull之间没有隐式转换。

DataTable中列有数据类型指定(在这种情况下,DataType = Type.GetType("System.DateTime")),我设置AllowDBNull = true此列

如何处理呢?

谢谢!

回答

10

问题是因为操作的您正在使用。由于DBNull.Value不是字符串,因此不能使用条件运算符。这是因为,从conditional operator docs

first_expression和second_expression的类型必须是相同的,或者隐式转换必须存在从一种类型到另一种类型。

尝试这样做:

if (!string.IsNullOrWhiteSpace(data[i])) 
    row[i] = data[i]; 
else 
    row[i] = DBNull.Value; 

绕过这对双方是相同的转换要求。或者,您可以明确地将它们都转换为System.Object,并且仍然使用条件运算符。

6

你需要将它们都转换为对象,像这样:

row[i] = !string.IsNullOrWhiteSpace(data[i]) ? (object)data[i] : (object)DBNull.Value; 
+5

你只需要转换其中的一个'object'。 – SLaks 2011-02-25 18:11:47

1

我工作的Asp.Net MVC 5 C#Web应用程序,做这样的工作,并罚款

rw[6] = (qry.PODate != null) ? qry.PODate : (object)DBNull.Value;