【问题标题】:.Net SqlDataReader Item is Null [VB].Net SqlDataReader 项目为空 [VB]
【发布时间】:2011-06-21 22:18:56
【问题描述】:

好吧,这很奇怪。我今晚在为我们的公司网站添加功能时遇到了这个问题。

我正在构建一个自定义日历控件,用于查询我们的数据库以显示公司活动。情况就是这样,存储了一个EndDate 值,并且在开发系统上,其中一个事件具有NULL 值。没什么大不了的,因为它只是一个测试系统,但为了安全起见,不妨在尝试使用它之前进行检查。我认为以下代码可以工作:

While dr.Read()
  corporateTable.Rows.Add(New Object() { _
    Convert.ToDateTime(dr("EventBeginDate")) _
    , IIf(dr("EventEndDate") Is DBNull.Value, Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _
    , Convert.ToString(dr("EventType")) _
    , Convert.ToString(dr("EventDescription")) _
    , Convert.ToString(dr("EventMessage")) _
  })
End While

但它没有,我仍然不断收到Object cannot be cast from DBNULL 错误。所以我想了想,想出了这个成功的代码,虽然我不喜欢它并且认为它很丑。

While dr.Read()
  Dim column As Integer = 0
  While column < dr.FieldCount - 1
    If dr.GetName(column) = "EventEndDate" Then
      Exit While
    End If

    column += 1
  End While
  corporateTable.Rows.Add(New Object() { _
    Convert.ToDateTime(dr("EventBeginDate")) _
    , IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), dr.Item(column)) _
    , Convert.ToString(dr("EventType")) _
    , Convert.ToString(dr("EventDescription")) _
    , Convert.ToString(dr("EventMessage")) _
  })
End While

真正让我感动的是,有一次我有这样的经历:

, IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _

认为它应该可以工作,因为它应该只评估dr(),如果它不是NULL。但是,它最后一直出错,因为该值实际上是NULL

所以终于要回答我的问题了,抱歉解释太长了。

为什么即使我在使用该值之前检查它是否为NULL,它也会在除非它不是NULL 否则不会被调用的部分出错?这是否与我使用IIF() 并且它正在评估整个声明的事实有关?或者,使用dr(),它在运行时进行评估?

我很困惑,想知道到底发生了什么,所以如果可能的话,想出一个更清洁的解决方案。

提前致谢!

【问题讨论】:

    标签: .net vb.net null sqldatareader


    【解决方案1】:

    IIf 始终评估真假部分 - 如果您想避免这种情况,请改用内联 If

    While dr.Read()
      corporateTable.Rows.Add(New Object() { _
        Convert.ToDateTime(dr("EventBeginDate")) _
        , If(dr("EventEndDate") Is DBNull.Value, Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _
        , Convert.ToString(dr("EventType")) _
        , Convert.ToString(dr("EventDescription")) _
        , Convert.ToString(dr("EventMessage")) _
      })
    End While
    

    【讨论】:

    • 您也可以尝试使用这种方法制作扩展方法:bradwilson.typepad.com/blog/2008/01/c-30-extension.html
    • @Will:我总是对此感到好笑,因为函数 IIfimmediate if 的缩写,这与事实相去甚远。除非您将其解释为立即评估这两个条件。 =)
    • 不幸的是,这不起作用,它挂断了页面。不过,我会牢记这一点。
    • @Yuck - 哈哈,同样,很遗憾它从一开始就不是一个合适的内联。
    • @Kyle - If(...) 不太可能负责挂起页面 - 你确定它挂起并且不会出错?
    【解决方案2】:

    Iif 函数正在评估每个语句,请使用不同的构造进行空检查,例如 The IF function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多