首页 > 解决方案 > 如何使用空字符串更新 Microsoft Access 数据库?

问题描述

我正在尝试使用我的 WPF/C# 表单中的一些数据来更新我的 Microsoft Access 数据库。数据库中的数据首先用于填充表单。一旦用户请求更改此表单,我将数据保存在字典中(即'OriginalName' 及其值),然后他们进行更改并单击完成,我保存新数据(即NewName 及其值)。问题是,如果数据库的一部分一开始是空的,而我尝试使用该空值更新数据库,它会失败。例如,如果数据库包含姓名、性别和地址(Michael,Male,275 Blue Avenue)。然后用户更改名称(James,Male,275 Blue Avenue),我的更新成功运行

UPDATE TABLENAME 
SET NameCol = @newName, GenderCol = @newGender, AddressCol = @newAddress 
where NameCol = @OriginalName AND GenderCol = @OriginalGender AND AddressCol = @OriginalAddress 

所有这些参数都已按正确顺序设置和使用,如下所示:

command.Parameters.AddWithValue("@newName",myDictionary["NewName"]);

但是,如果一列是空的,它将失败。例如,如果 Address 列原本为空,用户更改了 Name,但 Gender 和 Address 保持不变,则更新失败。任何帮助将非常感激。谢谢你。

标签: c#sqlms-access

解决方案


如前所述,该地区有两个营地。允许空值,或始终使用 ZLS(零长度字符串)。

我更喜欢并建议所有空字符串都是空值。这只是我的习惯,但我认为它更好。当然,原因是即使您从不保存它们,您的代码也会遇到很多空值。您第一次编写关系联接时,通常是左联接来引导?好吧,当不存在子记录时,子表列将为空并且为空。结果,作为开发人员,您将不得不始终围绕数据库中的空值进行编码。既然你必须处理所有这些空值,那么不妨采用所有空字符串都保存为空值的标准。我一般不会对数字执行此操作,但对于日期和字符串(文本),我采用保存空值的标准 - 而不是 ZLS。

但是你可以修改访问表——设置allow ZLS = true。但是现在您在给定的列中有一个 ZLS 字符串和空字符串的大杂烩。

SELECT * FROM myTable 其中 City 为空

然后变成

SELECT * FROM MyTable WHERE City 为 null 或 City = ""

这是一个真正的痛苦。

我建议这样做:

    Dim strSQL As String
    strSQL = "UPDATE tblHotels Set FirstName = @FirstName," &
             "LastName = @LastName," &
             "HotelName = @HotelName," &
             "City = @City " &
             "WHERE ID = @ID"
    Debug.Print(strSQL)
    Using cmdSQL As New OleDbCommand(strSQL,
            New OleDbConnection(My.Settings.TESTOLEDB))
        cmdSQL.Parameters.Add("@FirstName", OleDbType.VarWChar).Value = STNull(txtFirstName.Text)
        cmdSQL.Parameters.Add("@LastName", OleDbType.VarWChar).Value = STNull(txtLastName.Text)
        cmdSQL.Parameters.Add("@HotelName", OleDbType.VarWChar).Value = STNull(txtHotelName.Text)
        cmdSQL.Parameters.Add("@City", OleDbType.VarWChar).Value = STNull(txtCity.Text)
        cmdSQL.Parameters.Add("@ID", OleDbType.Integer).Value = txtID.Text

        cmdSQL.Connection.Open()
        cmdSQL.ExecuteNonQuery()
        cmdSQL.Dispose()

    End Using

End Sub

Public Function STNull(s As String) As Object
    If s = "" Then
        Return DBNull.Value
    Else
        Return s
    End If
End Function

Public Function NullST(s As Object) As Object

    If IsDBNull(s) Then
        Return ""
    Else
        Return s
    End If
End Function 

所以我建立了一个例程来获取/将空值转换为“”并再次返回。

因此,要加载控制值,您需要:

    Dim rst As New DataTable
    Dim strSQL As String = "SELECT * from tblHotels WHERE ID = " & txtID.Text
    Using cmdSQL As New OleDb.OleDbCommand(strSQL,
        New OleDbConnection(My.Settings.TESTOLEDB))
        cmdSQL.Connection.Open()
        rst.Load(cmdSQL.ExecuteReader)
        cmdSQL.Dispose()
    End Using

    If rst.Rows.Count = 0 Then Exit Sub

    With rst.Rows(0)
        txtFirstName.Text = NullST(.Item("FirstName"))
        txtLastName.Text = NullST(.Item("LastName"))
        txtHotelName.Text = NullST(.Item("HotelName"))
        txtCity.Text = NullST(.Item("City"))
    End With

推荐阅读