我有一个文本文件,我读入数据表,然后执行批量插入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
我该如何处理?
谢谢!
答案 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;