如何使用空字符串更新 Microsoft Access 数据库?

Posted

技术标签:

【中文标题】如何使用空字符串更新 Microsoft Access 数据库?【英文标题】:How do I update a Microsoft Access Database with an empty string? 【发布时间】:2021-04-26 18:16:09 【问题描述】:

我正在尝试使用我的 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 保持不变,则更新失败。任何帮助将非常感激。谢谢。

【问题讨论】:

如果用户更改了姓名但保持性别和地址不变@newGender@newAddress@OriginalGender@OriginalAddress 的值是多少? 是的,它们将是相同的值,因为在它们进行更改并单击“完成”后,我会再次从表单 UI 中获取所有值并将这些值保存为“新”值,所以如果它们有没有更改性别和地址,它们的值与原始值相同。我在字典中检查了这一点。 - 那里有太多冲突的标签。删除不涉及的。 我建议不要将空字符串保存到字段中。我更喜欢 Null。 @forpas 感谢您为我指明正确的方向。我找到了一个解决方案,如果元素为空,我将返回一个空字符(“\0”)。这成功运行并更新所有表。再次感谢。 【参考方案1】:

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

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

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

SELECT * FROM myTable where 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

【讨论】:

以上是关于如何使用空字符串更新 Microsoft Access 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个空字符串并更新它[重复]

Oracle SQL 使用空字符串更新 NOT NULL 列

更新触发器后创建空字符串时出现无法解释的 MySQL 错误 #1064?

PostgreSQL - 我有啥办法可以定义一个在插入或更新时将空字符串转换为 null 的列?

空字符串无法解释的MySQL错误#1064创建更新触发器后?

python经常使用的十进制16进制字符串字节串之间的转换(长期更新帖)