c# - 如何使用空字符串更新 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 保持不变,则更新失败。任何帮助将非常感激。谢谢你。
解决方案
如前所述,该地区有两个营地。允许空值,或始终使用 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
推荐阅读
- webrtc - 会话中视频聊天记录和回放技术/解决方案建议
- java - 在Android的滚动视图中覆盖旋转加载
- typescript - 在 tsc --build 如何克服 --incremental 和 --tsBuildInfoFile
- spring - jakarta.validation.Payload 类型无法解析
- reactjs - 我可以在 REACT 中加载嵌入式脚本,但无法在其中使用微调器。请提出任何替代方案或最佳解决方案
- c++ - push_back 的替代方法或如何加速二维数组的向量
- apache-spark - 如何改进 Spark 中的突触写入?
- imagemagick - ImageMagick 中的 Gimp AutoInputLevels
- python - 使用 fastapi 更新具有可为空属性的对象的最佳方法
- angular - Angular removesAt 仅通过 FormArray 中的第一个控件删除其他控件