将DataRow项设置为null

16

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

现在,我已经搞清楚了这个概念,所以我要回去在数据库和我的代码中分配真正的数据类型。数据库已经为字段分配了正确的类型,现在我正在处理代码。

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

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

我试图使用 null,但是会收到错误提示要我使用 DBNull。当我使用 DBNull 时,会有一条消息告诉我 string 和 System.DBNull 之间没有隐式转换。

数据表中的列已经指定了数据类型(在这种情况下,DataType = Type.GetType("System.DateTime")),并且我为该列设置了 AllowDBNull = true

我应该如何处理这个问题?

谢谢!

4个回答

20
问题出在你使用的操作上。由于DBNull.Value不是字符串,所以无法使用条件运算符。这是因为根据条件运算符文档所述:

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

尝试这样做:
if (!string.IsNullOrWhiteSpace(data[i]))
    row[i] = data[i];
else
    row[i] = DBNull.Value;

这将绕过双方需要相同的转换要求。或者,您可以明确地将两者都强制转换为System.Object,仍然可以使用条件运算符。

9

您需要将它们都转换为对象,如下所示:

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

8
只需要将它们中的一个转换为 object 类型即可。 - SLaks

3

我正在开发一个Asp.Net MVC 5 C# Web应用程序,我像这样做并且运行良好

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

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接