【问题标题】:Why does my vb.net code not change my Access2007 database为什么我的 vb.net 代码不会改变我的 Access2007 数据库
【发布时间】:2021-12-11 00:47:59
【问题描述】:

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

有什么建议和/或如何解决问题? /库尔特·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

【问题讨论】:

  • 我从未使用过适配器,但您有一个 BeginEdit() 却没有对应的 EndEdit()Adapter.Update(ds) 应该返回受影响的行数,所以不要忽略它。
  • 如果您要编写 OleDbCommand,只需将查询更改为实际的 UPDATE 查询,然后使用 cmd.ExecuteNonQuery。无需读取数据,在 .NET 代码中更新数据,并让适配器更新数据库。
  • Stop 在那里做什么?你永远不会执行任何事情。

标签: vb.net ms-access-2007 oledbdataadapter


【解决方案1】:

根据@LarsTech's comment

我从未使用过适配器,但您的 BeginEdit() 没有对应的 EndEdit()Adapter.Update(ds) 应该返回受影响的行数,所以不要忽略它。

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

感谢拉斯的帮助。

【讨论】:

    【解决方案2】:

    连接和命令使用需要释放的非托管资源。他们的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
    

    【讨论】:

    • 感谢您的提示 - 应尝试使用 using - 以前从未这样做过。听起来不错,不必一直处理。
    • @KurtJohansson 我忘记了 Where 子句!我已经编辑了我的答案以包含 Where 子句。很抱歉。顺便说一句,即使出现错误,Using 块也可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多