如果单元格可能为null,则从数据行读取的正确方法是什么

时间:2009-11-21 14:40:18

标签: c# null datarow

如果datarow(dr)中的列为null,我有以下代码似乎会爆炸。从数据行中解析出值并处理空值检查的正确方法是什么?

Person person = new Person()
{
    FirstName = dr["FirstName"].ToString(),
    LastName = dr["LastName"].ToString(),
    BusinessPhoneNumber = dr["BusinessPhone"].ToString(),

5 个答案:

答案 0 :(得分:10)

如果列的类型为string,但是可以为空,那么尝试:

// FirstName must allow null
FirstName = dr["FirstName"] as string

// FirstName would be empty for a NULL in the database
FirstName = (dr["FirstName"] as string) ?? string.Empty 

答案 1 :(得分:4)

我相信,数据单元无效可能是您遇到问题的原因。也许该列不存在,或者发生任何其他错误,或者DataRow本身为null,您应该处理它。看看例外 - "似乎爆炸了#34;不是对您的问题的有效描述。

以下内容解释了这一点,但也会回答其他人的标题问题。

如果列值为null,则返回对象System.DBNull.ToString()返回空字符串,而(string)as string返回null

因此检查==null的返回项目是没有意义的,因为它不会评估为true

  • 如果您接受空字符串,那么您的代码已经是最佳的,无需处理DBNull案例。
  • 如果您想获得null,请将.ToString()更改为as string
  • 如果您想以任何其他方式处理此问题,请在if (dr.IsNull("FirstName"))之后使用==null或对目标变量执行as string

答案 2 :(得分:2)

dr["FirstName"].ToString()偶尔会抛出空指针异常,因为您尝试访问空对象上的ToString。除此之外,字符串可以为null,所以实际上,如果你知道它是一个字符串,并且你不介意它是null,那么它是安全的

FirstName = (String) dr["FirstName"]

答案 3 :(得分:1)

将列和默认值传递给检查null的辅助函数,如果为null则返回默认值,如果不为null,则返回列值。

答案 4 :(得分:1)

如果列为null,则可以使用以下命令返回空白字符串。

FirstName = string.format("{0}", dr["FirstName"])