为什么我的 vb.net 代码没有改变我的 Access2007 数据库

Why does my vb.net code not change my Access2007 database

我有一个 Access 数据库 2007 并尝试使用下面显示的代码编辑内容。 代码无一例外都是运行,但没有改变原来的数据。 该数据库有一个主键 (ID) 以及大约 20 列。 使用相同的数据库并使用 Adapter.Update(ds) 添加新行可以正常工作-(此处未显示)。 现在我已经编写了一个最小的代码来更改特定列 (=4) 中的内容以查看出了什么问题,但是没有显示错误并且数据库没有被更改。我正在为 .exe 应用程序使用 VS 2019。

任何错误的建议and/or如何解决? /库尔特 J

 Private Sub Button2_Click_(sender As Object, e As EventArgs) Handles Button2.Click
        'testa att uppdatera databas
        cnnTävl = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + TPath + AktTävlNamn + "_" + AktTävlDat + ".mdb")
        Dim strSQL = "Select * FROM Deltagare WHERE Patrull='12' AND Figur='01'"
        Dim cmd As New OleDb.OleDbCommand(strSQL, cnnTävl)
        Dim Adapter As New OleDb.OleDbDataAdapter(cmd)
        Dim ds As New DataSet
        Dim cb As New OleDb.OleDbCommandBuilder(Adapter)
        Stop
        Try
            cnnTävl.Open()
            Adapter.Fill(ds)
            If ds.Tables(0).Rows.Count = 1 Then
                ds.Tables(0).Rows(0).BeginEdit()
                ds.Tables(0).Rows(0).Item(4) = "Bo Ek"
            Else
                MsgBox("No rows to edit")
                cnnTävl.Close()
                Exit Sub
            End If
            cb.GetUpdateCommand()
            Adapter.Update(ds)
        Catch Er As Exception
            MsgBox("Er= " + Er.Message)
        End Try
        cnnTävl.Close()
    End Sub

连接和命令使用了需要释放的非托管资源。他们的 Dispose 方法就是这样做的。必须调用Dispose方法;幸运的是,我们有 Using...End Using 块可以为我们处理这个问题并关闭连接。

您不需要使用DataAdapter 和DataSet 调用所有数据。直接更新就好了

Private Sub Button2_Click_(sender As Object, e As EventArgs) Handles Button2.Click
    'testa att uppdatera databas
    Dim strSql = "Update Deltagare Set NameOf5thColumn = 'Bo Ek'WHERE Patrull='12' AND Figur='01';"
    Dim RecordsEffected As Integer
    Using cnnTävl = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + TPath + AktTävlNamn + "_" + AktTävlDat + ".mdb"),
            cmd As New OleDb.OleDbCommand(strSql, cnnTävl)
        Debug.Print(cnnTävl.ConnectionString)
        Try
            cnnTävl.Open()
            RecordsEffected = cmd.ExecuteNonQuery()
        Catch Er As Exception
            MsgBox("Er= " + Er.Message)
        End Try
    End Using
    If RecordsEffected = 1 Then
        MessageBox.Show("Success!")
    Else
        MessageBox.Show("Failure!")
    End If
End Sub

根据

I've never worked with adapters, but you have a BeginEdit() without a corresponding EndEdit(). Adapter.Update(ds) should return the number of rows affected, so don't ignore that.

EndEdit() 解决了问题。我在网上看到的所有例子都没有使用EndEdit(),但可能是例子太旧了。

谢谢拉尔斯的帮助。