插入访问时如何处理空字段

时间:2015-03-09 19:53:10

标签: vb.net ms-access null dbnull

我正在尝试将值从表单插入Access数据库,但是当字段值为Null时出现错误。即使我使用= DBNull.Value,我仍然会收到错误。

前8个值不能是Null,因为它们是必填字段,但如果字段为空则一旦达到成本,我就会收到此错误。

Screenshot of error

第577行是da.Update(ds, "EquipList")

这是我的代码:

 Try
        Dim con As New OleDb.OleDbConnection
        Dim ds As New DataSet
        Dim da As OleDb.OleDbDataAdapter
        Dim sql As String
        con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\equip_full.mdb;Jet OLEDB:Database Password=matt"
        con.Open()

        sql = "SELECT * FROM EquipList"
        da = New OleDb.OleDbDataAdapter(sql, con)

        da.Fill(ds, "EquipList")
        Dim cb As New OleDb.OleDbCommandBuilder(da)
        Dim dsNewRow As DataRow
        dsNewRow = ds.Tables("EquipList").NewRow()

        ' Equipment Information fields

        dsNewRow.Item(0) = UniqueID
        dsNewRow.Item(1) = InvNumber
        dsNewRow.Item(2) = Item

        dsNewRow.Item(3) = Type

        dsNewRow.Item(4) = Description

        dsNewRow.Item(5) = Manufacturer
        dsNewRow.Item(6) = Model_No
        dsNewRow.Item(7) = Serial_No
        If Cost = "" Then
            dsNewRow.Item(8) = DBNull.Value
        Else
            dsNewRow.Item(8) = Cost
        End If
        If Cost_Centre = "" Then
            dsNewRow.Item(9) = DBNull.Value
        Else
            dsNewRow.Item(9) = Cost_Centre
        End If

        'dsNewRow 10 to 39

        ds.Tables("EquipList").Rows.Add(dsNewRow)
        da.Update(ds, "EquipList")
        con.Close()

        MsgBox(Description & " has successfully been added to the system.")

 Catch ex As Exception
        MsgBox("Unable to connect to the database " & ex.ToString)
        Exit Sub
 End Try

更新:我的代码很好,这只是MsgBox的一个问题。 MsgBox无法显示Null值


删除MsgBox修复了问题。无论如何它只是用于测试。

2 个答案:

答案 0 :(得分:1)

如果不将其设置为其他任何内容,则应将其保留为null。 你试过吗

   If Cost > "" Then
        dsNewRow.Item(8) = Cost
    End If


该字段可以为空吗? 如果它不能为null,您也可以尝试将其设置为零:

   If Cost > "" Then
        dsNewRow.Item(8) = Cost
   Else
        dsNewRow.Item(8) = 0
   End If

你不需要显式地将日期或字符串值设置为null,如果它可以为空,则默认值为null,将其默认设置为null,而货币值可能不是。

例如,您的其他价值应与:

一起使用
If Cost_Centre > "" Then
    dsNewRow.Item(9) = Cost_Centre
End If

这是假设您的值可以为空,或者它们将接受null作为有效值。您是否通过Access界面确认了?

如果字符串值不接受null,则默认为空字符串,该值与空文本框的值相同。那么,您应该无条件地存储该值,就像您使用所需的值一样:

   If Cost > "" Then
        dsNewRow.Item(8) = Cost
   Else
        dsNewRow.Item(8) = 0
   End If
   dsNewRow.Item(9) = Cost_Centre

答案 1 :(得分:0)

如果字段中有空格或其他内容,请稍微修改Beth的帖子。

 If len(Cost) > 0 Then
    dsNewRow.Item(8) = Cost
End If