c# - 处理 DBNull 的最佳方法是什么

标签 c# .net sql-server

我经常在处理从 SqlDataAdapters 返回的 DataRows 时遇到问题。当我尝试使用如下代码填充对象时:

DataRow row = ds.Tables[0].Rows[0];
string value = (string)row;

在这种情况下,处理 DBNull 的 的最佳方法是什么。

最佳答案

可为空的类型很好,但仅适用于不可为空的类型。

要使类型“可为空”,请在类型后附加一个问号,例如:

int? value = 5;

我还建议使用“as”关键字而不是转换。您只能在可空类型上使用“as”关键字,因此请确保您正在强制转换已经可以为空的内容(如字符串),或者您使用如上所述的可空类型。这样做的原因是

  1. 如果类型可为空,则“as”关键字在值为 DBNull 时返回 null
  2. ever-so-slightly faster than casting虽然only in certain cases .这本身永远不是使用 as 的充分理由,但结合上述原因它是有用的。

我建议这样做

DataRow row = ds.Tables[0].Rows[0];
string value = row as string;

在上面的例子中,如果 row 返回为 DBNull,那么 value 将变为 null 而不是抛出异常。请注意,如果您的数据库查询更改了返回的列/类型,使用 as 将导致您的代码无声地失败并使值简单 null而不是在返回不正确的数据时抛出适当的异常,因此建议您进行测试以其他方式验证您的查询,以确保随着代码库的发展数据的完整性。

关于c# - 处理 DBNull 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809/

相关文章:

sql - 如何从没有 id 的表中删除重复(重复)记录和行

SQL:根据 GETDATE() 进行列验证

C# 没有另一个列表元素的列表(集合论、补集)

c# - 从外部覆盖类的构造函数

c# - DataView 中的回发事件

.net - 为什么我不能在事件触发器中放置一个 Setter

sql - 存储过程将不返回任何错误消息或编号

c# - 如何在WPF中检测父对象的子对象的变化?

c# - 模拟和 BackgroundWorker

.net - 使用 MEF 动态加载 XAP 文件时出现问题。 IE 正在崩溃