0

我的客户使用多用户拆分 Access 数据库(即服务器上的后端数据库,每台 PC 上的客户端数据库)作为销售点系统以及管理功能。

他现在需要它来更新远程 MS SQL 数据库,但不能在客户等待时降低 Access 客户端的速度。如果我向访问客户端数据库中的每个更新/追加/删除添加代码以运行 SQL SP,它会大大降低每个事务的速度(我已经尝试过了)。

我想知道是否可以在后端 Access DB 上使用触发器宏来运行 SQL SP,而不会减慢客户端 DB 的速度。客户端数据库是否必须等待触发器宏运行才能恢复其工作,或者这是将客户端与服务器上发生的 SQL 更新断开连接的好方法?

我从来没有使用过触发宏,为了测试它,在每个表上研究和创建这些宏需要做很多工作,所以如果有人能回答上面的问题,它可以为我节省很多时间(可能是浪费的)工作!

4

2 回答 2

1

我想知道是否可以在后端 Access DB 上使用触发器宏来运行 SQL SP

不直接,不。Access 中的事件驱动数据宏无法执行外部代码(VBA 例程、传递查询等),也无法对链接表进行操作。

可以做的是在主表上使用事件驱动的数据宏来收集存储过程所需的信息并将其保存在后端单独的“排队”表中,然后运行计划任务每隔几分钟(左右)调用存储过程并将“排队”信息传递给它们。

于 2016-02-06T02:19:34.053 回答
0

我更简单的解决方案可能是使用指向 SQL 数据库的链接表,然后创建并调用一个 VBA 函数,该函数使用该函数构建和执行更新查询。在链接表上使用 SQLPassthough。这允许函数立即返回,避免 SQL 数据库中的维护和开销,以及所有初始设置时间。如果需要,链接表还可以保留所有连接,包括用户名和密码。

来自数据宏的 DAO SQLPassthrough 调用的存根

VBA 函数(通用代码)

Public Function SetTimeStamp(ByVal RecordID as Variant)

   Dim strSQL As String
   Dim db As DAO.Database

   strSQL = "UPDATE tblName SET tblName.TimeStampField = " & Now()
   strSQL = strSQL & " WHERE RecordIDField = " & RecordID
   Set db = CurrentDB()
   db.execute strSQL, dbSQLpassThrough + dbRunAsync

End Function

要在更新后事件中实现,请使用 SetLocalVar 调用函数数据宏(通用代码)

If Updated("MyField1") or Updated("MyField2") or Updated("MyField3")
   SetLocalVar 
            Name  varTemp
      Expression  =SetTimeStamp([TableName].[RecordIDField]
End If

这将导致函数执行。它反过来使用 SQLPassThrough 和异步选项运行查询,这会导致 Access 应用程序的速度为零。它可以很容易地修改为将表名称和时间戳字段名称作为参数传递,以便可以在任何表上使用,写入更多字段等。

我发现单个 Access 函数的优势在于,如果您决定增强它,您只需将数据字段添加到表中并修复单个函数。此外,没有计划任务或要维护的队列,这使其成为更清洁的解决方案。

艺术

于 2016-11-11T19:39:21.460 回答