我想生成从MS-Access数据库检索并存储在 DataTable 对象/变量myDataTable中的数据的格式化输出。但是,myDataTable中的某些字段包含 dbNull 数据。因此,如果任何字段 lastname intials sID 的值为的DBNull

   dim myDataTable as DataTable
   dim tmpStr as String
   dim sID as Integer = 1

   ...
   myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
   ...

   For Each myItem As DataRow In myDataTable.Rows

    tmpStr = nameItem("lastname") + " " + nameItem("initials")

    If myItem("sID")=sID Then
        ' Do something
    End If

    ' print tmpStr

   Next

那么,当字段可能包含 dbNull 而不必每次检查数据是否为dbNull时,如何使上述代码工作,如这个问题

有帮助吗?

解决方案

我所知道的唯一方法就是测试它,你可以做一个综合的,如果让它变得容易。

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

我在VB中写道,即使你混合了语言,这就是你需要的东西。

修改

清理使用IsDbNull使其更具可读性

其他提示

我厌倦了处理这个问题所以我写了一个NotNull()函数来帮助我。

Public Shared Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T
        If Value Is Nothing OrElse IsDBNull(Value) Then
                Return DefaultValue
        Else
                Return Value
        End If
End Function

用法:

If NotNull(myItem("sID"), "") = sID Then
  ' Do something
End If

多年来,我的NotNull()函数经历了几次大修。在Generics之前,我只是将所有内容都指定为Object。但我更喜欢通用版本。

您还可以使用Convert.ToString()和Convert.To Integer()方法有效地转换带有DBnull的项目。

Steve Wortham的代码的变体,名义上与 nullable 类型一起使用:

Private Shared Function GetNullable(Of T)(dataobj As Object) As T
    If Convert.IsDBNull(dataobj) Then
        Return Nothing
    Else
        Return CType(dataobj, T)
    End If
End Function

e.g。

mynullable = GetNullable(Of Integer?)(myobj)

然后您可以查询 mynullable (例如, mynullable.HasValue

Microsoft在.NET 1.0中提出了DBNull来表示数据库NULL。但是,使用后台很麻烦,因为您无法创建强类型变量来存储真值或null。微软通过可空类型解决了.NET 2.0中的问题。但是,您仍然遇到使用DBNull的大块API,并且无法更改它们。

只是一个建议,但我通常做的是:

  1. 包含从数据库读取或写入数据的数据的所有变量都应该能够处理空值。对于值类型,这意味着将它们设为Nullable(Of T)。对于引用类型(String和Byte()),这意味着允许该值为Nothing。
  2. 编写一组函数以在“可能包含DBNull的对象”之间来回转换。和“可空的.NET变量”。在这些函数中包含对DBNull样式API的所有调用,然后假装DBNull不存在。

如果您正在使用BLL / DAL设置,请在读取DAL中的对象时尝试使用iif

While reader.Read()
 colDropdownListNames.Add(New DDLItem( _
 CType(reader("rid"), Integer), _
 CType(reader("Item_Status"), String), _
 CType(reader("Text_Show"), String), _
 CType( IIf(IsDBNull(reader("Text_Use")), "", reader("Text_Use")) , String), _
 CType(reader("Text_SystemOnly"), String), _
 CType(reader("Parent_rid"), Integer)))
End While

您可以使用IsDbNull函数:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

对于包含字符串的行,我可以像更改

一样将它们转换为字符串
tmpStr = nameItem("lastname") + " " + nameItem("initials")

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

对于 if 语句 myItem(" sID")= sID 中的比较,需要将其更改为

myItem("sID").Equals(sID)

然后,由于 vbNull 数据,代码将运行时没有任何运行时错误。

   VB.Net
   ========
    Dim da As New SqlDataAdapter
    Dim dt As New DataTable
    Call conecDB()        'Connection to Database
    da.SelectCommand = New SqlCommand("select max(RefNo) from BaseData", connDB)

    da.Fill(dt)

    If dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) = "" Then
        MsgBox("datbase is null")

    ElseIf dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) <> "" Then
        MsgBox("datbase have value")

    End If

朋友你好

这是在DataGrid中检查db Null并转换为字符串的最短方法

  1. 创建单元格验证事件并编写此代码
  2. 如果Convert.ToString(dgv.CurrentCell.Value)=&quot;&quot;然后
  3. CurrentCell.Value =&quot;&quot;
  4. 结束如果

BY FAR 是将 DBNull 转换为字符串的最简单方法。 诀窍在于, CAN NOT 在引用数据库中的字段时使用 TRIM 函数(这是我最初的问题):

BEFORE (产生错误消息):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

AFTER (没有错误信息:-)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))

我认为这应该更容易使用:

  

从tablename

中选择ISNULL(sum(field),0)

复制自: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top