79

我想生成一些从 MS-Access 数据库中检索并存储在DataTable对象/变量 myDataTable 中的数据的格式化输出。但是,myDataTable 中的某些字段包含dbNull数据。因此,如果任何字段lastnameintialssID的值为dbNull,则以下 VB.net 代码片段将给出错误。

   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 ,就像这个问题一样?

4

13 回答 13

139

我所知道的唯一方法是对其进行测试,您可以进行组合以使其变得容易。

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

我用 VB 编写,因为这看起来像是你需要的,即使你混合了语言。

编辑

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

于 2008-10-21T18:07:57.860 回答
35

我厌倦了处理这个问题,所以我写了一个 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() 函数经历了几次大修。在泛型之前,我只是将所有内容都指定为对象。但我更喜欢通用版本。

于 2009-11-12T17:10:10.680 回答
11

您还可以使用 Convert.ToString() 和 Convert.ToInteger() 方法有效地转换 DB null 的项目。

于 2008-10-21T18:09:57.543 回答
6

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

例如

mynullable = GetNullable(Of Integer?)(myobj)

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

于 2012-03-31T05:52:58.543 回答
3

Microsoft 在 .NET 1.0 中提出了 DBNull 来表示数据库 NULL。但是,使用起来很麻烦,因为您无法创建强类型变量来存储真正的值或空值。Microsoft 在 .NET 2.0 中使用可空类型解决了这个问题。但是,您仍然被大量使用 DBNull 的 API 所困扰,并且无法更改它们。

只是一个建议,但我通常会这样做:

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

您可以使用 IsDbNull 函数:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If
于 2008-10-21T18:08:41.137 回答
2

如果您使用的是 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
于 2012-09-05T12:25:03.700 回答
1

对于包含字符串的行,我可以将它们转换为字符串,如更改

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

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

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

myItem("sID").Equals(sID)

然后代码将运行而不会由于vbNull数据而出现任何运行时错误。

于 2008-10-21T18:08:01.060 回答
1
   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
于 2013-11-27T15:40:40.307 回答
0

你好朋友

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

  1. 创建单元格验证事件并编写此代码
  2. 如果 Convert.ToString(dgv.CurrentCell.Value) = "" 那么
  3. CurrentCell.Value = ""
  4. 万一
于 2013-08-11T10:10:41.370 回答
0

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

之前(产生错误消息):

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

之后(不再有错误消息:-)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
于 2014-02-07T17:07:44.580 回答
0

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

从表名中选择 ISNULL(sum(field),0)

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

于 2016-09-26T20:33:43.147 回答
0

简单,但不明显。

DbNull.Value.Equals(myValue)

我讨厌 VB.NET

于 2021-11-10T17:12:54.000 回答