在 MS Access 中插入、更新或删除的数据不直接可用

Posted

技术标签:

【中文标题】在 MS Access 中插入、更新或删除的数据不直接可用【英文标题】:Data Inserted, Updated or Deleted in MS Access not directly available 【发布时间】:2021-02-15 03:35:30 【问题描述】:

我在 VB.Net 中的应用在 datagridview 中从 MS Access 加载数据(与 BindingSource 绑定,但如果是 DataTable,结果/问题是相同的)。

Private Sub LecturesPrestations()

        Dim myConnection = New OleDbConnection(S7ConnString)
        Try
            myConnection.Open()
            Requete = "SELECT s.ID, u.Nom, s.DatePresta, s.TimeIn, s.TimeOut, IIF(s.TimeOut IS NULL, NULL, CDATE(s.TimeOut - s.TimeIn)) AS Duree, s.Description " &
                      "FROM SAV_Prestas AS s " &
                      "INNER JOIN Users AS u ON u.ID = s.UserID " &
                      "WHERE s.NumRMA = " & monRetour.ID & ";"
            Call GetBindingSource(Requete, bsPrestas, RequeteOK)
            If Not RequeteOK Then
                MsgBox("Problème de lecture des données",, "Chargement des prestations")
            Else
                With Me.dgvPresta
                    .DataSource = bsPrestas
                    ...

然后我们可以通过显式访问指令(INSERT、DELETE、UPDATE...)在此 dgv 中插入、删除或修改一行。然后刷新(重新加载)dgv,以包含这些修改。

    Private Sub tsmiSuppression_Click(sender As Object, e As EventArgs) Handles tsmiSuppression.Click

        If dgvPresta.CurrentCell IsNot Nothing Then
            Requete = "DELETE * FROM SAV_Prestas WHERE ID = " & CInt(dgvPresta.Item("ID", dgvPresta.CurrentCell.RowIndex).Value.ToString)
            RequeteSQL(Requete, RequeteOK)
            If Not RequeteOK Then
                MsgBox("La prestation n'a pas pu être supprimée.")
            Else
                Call LecturesPrestations()
            End If
        Else
            MsgBox("Sélectionnez une prestation.", vbOKOnly, vbInformation)
        End If

    End Sub
    Public Sub RequeteSQL(ByVal Request As String, ByRef Resultat As Boolean, Optional ByRef MsgErreur As String = Nothing)

        Dim myConnection = New OleDb.OleDbConnection(S7ConnString)
        Try
            myConnection.Open()
            Dim myCommand = New OleDbCommand(Request, myConnection)
            myCommand.ExecuteNonQuery()
            Resultat = True
        Catch ex As Exception
            Resultat = False
            MsgErreur = ex.Message
        Finally
            myConnection.Close()
        End Try

    End Sub

这样dgv不会显示修改的数据(例如:删除的数据仍然出现)。只有在新的“刷新”几秒钟后才会出现修改。

您知道出了什么问题以及如何解决这个问题吗?

谢谢。

【问题讨论】:

在 RequeteSQL 中会发生什么? RequeteOK 在哪里设置为 True? Call LecuresPrestations() 运行吗? 我已经修改了我的帖子以包含 RequeteSQL。 GetBindingSource 和 RequeteSQL 都返回 True 的 RequeteOK。所以 LecturePrestations 正在重新加载。 【参考方案1】:

您是否尝试在 SQL 查询之后刷新您的 datagridview?

在“调用 LecturesPrestations()”之后调用 dgvPresta.refresh()

与您的数据库的连接性能和大小可能是问题所在。

【讨论】:

以上是关于在 MS Access 中插入、更新或删除的数据不直接可用的主要内容,如果未能解决你的问题,请参考以下文章

带有 MS Access 更新和插入问题的 Dapper

如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?

MS Access UPSERT(更新/插入)SQL [重复]

在组合框中使用向下/向上箭头键选择数据而不更新数据,直到点击选项卡或输入 MS Access

MS-ACCESS - 在插入之前/之后插入/更新触发器需要

删除数据后如何减小 ms access 数据库文件大小(*.accdb)(MS Office 2007)