【问题标题】:Block committing changes to Microsoft Access database阻止向 Microsoft Access 数据库提交更改
【发布时间】:2010-06-16 03:27:28
【问题描述】:

有没有办法编写一个在将更改提交到 Access DB 之前运行的钩子?如果特定进程当前正在查询数据库,我正在寻找一种阻止更改的方法。

【问题讨论】:

  • 您是否尝试过运行具有数据库独占访问权限的特定进程?这将阻止其他进程在运行时修改数据库。
  • 嗯,“特定”过程是一组部署脚本,用于计算数据库中的某些信息。但是,如果在部署执行过程中更改了数据库,那么一切都会搞砸。我听说可以通过部署脚本以编程方式将数据库或某些表设为只读,然后在部署完成后重新打开?
  • 您不能将数据库设为只读,但您可以将连接定义为独占。如何做到这一点取决于您访问 Jet/ACE 数据库(ODBC、ADO/OLEDB)的方式。

标签: ms-access hook pre-commit-hook


【解决方案1】:

您没有向我们提供太多信息。你能适应像Create and Use Flexible AutoNumber Fields 这样的东西,所以特定进程 首先专门打开一个表吗?然后任何其他可能更改数据的操作都必须等到他们可以锁定同一个表。

什么是具体流程?您是否有方法来确定何时/是否从您的数据库中读取数据?

如果特定进程在数据库外部,例如使用 ADO 获取数据的 Web 服务器 ASP 代码,您可以查看 ADO 连接模式和 IsolationLevel 属性是否有帮助。

更新:我使用了一个表单来试验 ADO 连接的 adModeShareDenyWrite Mode 属性。表单打开时,其他用户可以打开数据库,但不能进行任何更改。但是,如果其他用户在表单尝试打开连接时已经打开了数据库,则会触发错误。

也许您的部署脚本可能会尝试打开 adModeShareDenyWrite 连接,并在出错时退出。

Option Compare Database
Option Explicit
Dim cn As ADODB.Connection

Private Sub Form_Close()
    If Not (cn Is Nothing) Then
        cn.Close
        Set cn = Nothing
    End If
End Sub

Private Sub Form_Load()
    Set cn = New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=\\Cmpq\export\Access\backend\links2003.mdb;" & _
        "User Id=admin;Password=;"
    cn.Mode = adModeShareDenyWrite
    cn.Open
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2023-03-30
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多