首页 > 解决方案 > 此代码在 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

标签: vb.netms-access

解决方案


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


推荐阅读