vb.net - 此代码在 MS Access 中更新数据库值是否有任何问题?
问题描述
我的表单有一个 DataGridView,如果我单击一行,行详细信息将放置在表单上的相应控件中。然后我可以对这些控件进行一些更改,然后单击按钮更新。令人惊讶的是,该代码并未对数据库进行任何更改。我想知道,这段代码有什么问题吗?这是我的应用程序的更新按钮代码。
Private Sub UpdateButton_Click(sender As Object, e As EventArgs) Handles updateButton.Click
Try
Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Tukabakoma.mdb;")
conn.Open()
Dim cmd As New OleDbCommand("Update Members set [Name]=@name,Middlename=@midname,Surname=@sname,ContactNumber=@contnum,Address=@address,DOB=@dob,Gender=@gender,[Status]=@status,JoinDate=@jd,POB=@pob,[Guardian Name]=@guardname,[Guardian Surname]=@guardsname,Relationship=@rel,GuardNumber=@gcontnum where TKBS_ID=@tkbsid", conn)
With cmd.Parameters
.AddWithValue("@tkbsid", tkbsIDTextBox.Text)
.AddWithValue("@name", nameTextBox.Text)
.AddWithValue("@midname", middleNameTextBox.Text)
.AddWithValue("@sname", surnameTextBox.Text)
.AddWithValue("@contnum", contactTextBox.Text)
.AddWithValue("@address", addressTextBox.Text)
.AddWithValue("@jd", jdDateTimePicker.Value)
If maleRadioButton.Checked = True Then
.AddWithValue("@gender", maleRadioButton.Text)
ElseIf femaleRadioButton.Checked = True Then
.AddWithValue("@gender", femaleRadioButton.Text)
End If
.AddWithValue("@status", statusComboBox.Text)
.AddWithValue("@dob", dobDateTimePicker.Value)
.AddWithValue("@pob", burialPlaceTextBox.Text)
.AddWithValue("@guardname", gNameTextBox.Text)
.AddWithValue("@guardsname", gSurnameTextBox.Text)
.AddWithValue("@rel", relationshipTextBox.Text)
.AddWithValue("@gcontnum", gNumberTextBox.Text)
End With
cmd.ExecuteNonQuery()
RefreshDataGridView()
MessageBox.Show("Member information successfuly updated!", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Information)
cmd.Dispose()
conn.Close()
End Using
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR12", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
解决方案
OleDb 和 Access 的主要思想是将参数添加到参数集合中,其顺序与它们在 Sql 语句中出现的顺序相同。
.AddWithValue("@rel", relationshipTextBox.Text)
并且.AddWithValue("@gcontnum", gNumberTextBox.Text)
不在您的更新语句中,因此无法将它们添加到参数集合中。如果您更改 Update 语句以包含这些,请确保在将它们添加到参数集合时将它们放在正确的位置。
无需关闭您的连接,因为该End Using
线路将关闭并处理它。如果您对OleDbCommand
. 也就是说,包含在 Using 块中。
Dim cmd As New OleDbCommand(Dim cmd As New OleDbCommand("Update Members set
[Name]=@name,
Middlename=@midname,
Surname=@sname,
ContactNumber=@contnum,
Address=@address,
DOB=@dob,
Gender=@gender,
[Status]=@status,
JoinDate=@jd,
POB=@pob,
[Guardian Name]=@guardname,
[Guardian Surname]=@guardsname,
Relationship=@rel,
GuardNumber=@gcontnum
where TKBS_ID=@tkbsid", conn)
With cmd.Parameters
.AddWithValue("@name", nameTextBox.Text)
.AddWithValue("@midname", middleNameTextBox.Text)
.AddWithValue("@sname", surnameTextBox.Text)
.AddWithValue("@contnum", contactTextBox.Text)
.AddWithValue("@address", addressTextBox.Text)
.AddWithValue("@dob", dobDateTimePicker.Value)
If maleRadioButton.Checked = True Then
.AddWithValue("@gender", maleRadioButton.Text)
ElseIf femaleRadioButton.Checked = True Then
.AddWithValue("@gender", femaleRadioButton.Text)
End If
.AddWithValue("@status", statusComboBox.Text)
.AddWithValue("@jd", jdDateTimePicker.Value)
.AddWithValue("@pob", burialPlaceTextBox.Text)
.AddWithValue("@guardname", gNameTextBox.Text)
.AddWithValue("@guardsname", gSurnameTextBox.Text)
.AddWithValue("@tkbsid", tkbsIDTextBox.Text)
End With
我必须提到这.AddWithValue
不是最好的方法。请参阅http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
另一个:
https ://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
首选方法是.Add(parameterName As String, OleDbType As OleDBType, Size As Integer).Value = yourValue
推荐阅读
- jquery - 如何使用 jQuery 滑块显示文本值?
- node.js - Nightwatch:无法创建新服务:ChromeDriverService
- python - 如何从 Pandas 中的给定行和列开始读取 Excel 文件
- ignite - Apache Ignite 与 SQL Server 性能对比
- c# - 通过 .NET 访问电话文件
- azure - MarkLogic - 森林数据文件夹和 Azure Blob
- c# - Automapper EF 类到模型类
- python - 从 CSV 读取并计算平均值(python)
- charts - Chart.js 图表只有两个坐标
- reactjs - 将 basename 设置为 Domain/reactapp/#/home 而不是 Domain/#/reactapp/home