如何使用空字符串更新 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 中获取所有值并将这些值保存为“新”值,所以如果它们有没有更改性别和地址,它们的值与原始值相同。我在字典中检查了这一点。
如前所述,该地区有两个营地。允许空值,或始终使用 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 的列?