将DataRow项设置为null

时间:2011-02-25 18:07:32

标签: c# sql-server datatable datarow

我有一个文本文件,我读入数据表,然后执行批量插入SQL Server表。当所有导入的值都被视为字符串时(日期,字符串,整数等都被导入到字符串字段中),它非常快并且效果很好。

现在我已经解决了这个概念,我将回去在数据库和我的代码中分配真实的数据类型。数据库具有分配给字段的正确类型。我现在正在编写代码。

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

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

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

数据表中的列具有指定的数据类型(在本例中为DataType = Type.GetType("System.DateTime")),我为此列设置了AllowDBNull = true

我该如何处理?

谢谢!

4 个答案:

答案 0 :(得分:13)

问题在于您正在使用的操作。由于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,并仍然使用条件运算符。

答案 1 :(得分:7)

你需要将它们都投射到像这样的对象:

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

答案 2 :(得分:2)

我正在研究Asp.Net MVC 5 C#Web应用程序并且确实喜欢这样并且工作正常

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

答案 3 :(得分:0)

如果只想检查NULL,也可以使用以下语法:

row[i] = (object)data[i] ?? DBNull.Value;