【发布时间】:2019-07-23 12:14:55
【问题描述】:
我的表单有一个 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
【问题讨论】:
-
你的参数的顺序是关闭的。我建议使用 DataAdapter 来执行更新。
-
正确的方法是在数据库中创建一个
DataTable,Fill,如果合适的话,最初使用数据适配器,将其绑定到BindingSource,然后将其绑定到两者DataGridView和其他控件。当用户在各个控件中输入数据时,它会被推送到DataTable,因此将首先反映在DataGridView中。然后,您使用相同的数据适配器到Update数据库,其中包含来自DataTable的更改。 -
您应该在参数适用的列之后命名您的参数,这样如果您使用了错误的值就会很明显。
-
@jmcilhinney 怎么样?我已按照建议编辑了参数。
-
那是你研究的。这就是为什么我将其发布在评论而不是答案中。你现在所做的基本上都是错的,所以你需要回到绘图板上,学习如何以正确的方式去做。如果您这样做并且您尝试的方法不起作用,那么您可以发布一个新问题。