MS Access 应用程序 脱机工作
MS Access Application Work offline
我有一个 MS Access (2010) 应用程序通过链接表链接到 SQL Server (2012)。有什么方法可以让用户离线工作并在连接时同步到服务器?
提前致谢
在我看来,没有简单的方法可以做到这一点。
根据设计,我会将 SQL-Server 的相关内容镜像到本地访问数据库,并让访问程序使用该数据库。
但是 您需要找到一种方法将离线数据与 SQL-服务器同步。这是棘手的部分,它高度依赖于应用程序的设计目的。
对于来自 SQL 的 Access 中的只读数据,当然,只需要一个宏将 SQL table 的副本提取到用户运行的 Access 数据库中在离线之前刷新他们的副本。
如果有多个用户使用相同的数据,将更改同步回 SQL 服务器会变得更加复杂。同一条记录多次修改时,谁的'data'优先?
如果您的用户只添加数据,您可以设计一个持有 table 来保存新记录并让他们启动一个宏以将这些插入推送到 SQL table 并在他们使用时获取 SQL table 的新副本。但如前所述,如果他们正在编辑记录并且多个用户正在这样做,这很容易导致数据丢失和数据损坏。
方法是将 tables 链接到 2 个数据库上的 tables:链接到 SQL 服务器,链接到本地副本 Access 数据库文件。
- 您将日期从远程数据库复制到本地数据库
- 让用户处理本地副本
- 将数据同步回远程数据库
如果您使用相同的名称保留本地 table,并为指向远程 table 名称("Remote" 或 "rmt")的链接添加一些前缀,您可以保持你们大多数人的逻辑:你们仍然处理相同的 tables,只是链接到不同的位置。 您的主要问题仍然是同步。你得想办法了,要看本系统的数据流向。
在这种情况下,一般同步代码为:
For Each tdf In CurrentDb.TableDefs
If Left (tdf.name, 3) = "rmt" then
CurrentDB.Execuet "DELETE FROM " & tdf.name
CurrentDB.Execuet "INSERT INTO " & tdf.name & " SELECT * FROM " & Mid (tdf.name, 4)
End If
Next tdf
此代码从远程数据库中删除所有数据,并从本地数据库中插入数据。查看这是否是您需要的同步方法,或者您应该修改代码以满足您的需要。向每个 table 中的每个记录添加一个 LastUpdate
字段(并在每次数据修改时对其进行更新),可以支持良好的同步决策制定:删除哪些记录 , 以及 Insert 的内容,并在上述语句中添加适当的 WHERE
子句。
你也可以有一个通用 UPDATE
SQL 假设每个 table 的主键被命名为 table 名称,带有 "ID" 前缀:
Dim strSQL As String, srsbl As String, PK As String
Dim tdf As DAO.TableDef, fld As DAO.Field
For Each tdf In CurrentDb.TableDefs
if Left (tdf.name, 3) = "rmt" then
srsTbl = Mid (tdf.name, 4)
PK = "ID" & srsTbl
strSQL = "UPDATE " & tdf.name & " Inner Join " & srsTbl & " ON " & tdf.name & "." & PK & " = " & srsTbl & "." & PK & " SET "
For Each fld in tdf.Fields
if fld.Name <> PK then
strSQL = strSQL & tdf.name & "." & fld.Name & " = " & srsTbl & "." & fld.Name & ", "
End If
Next
' Remove Last comma:
strSQL = Left (strSQL, Len(strSQL) - Len(","))
' strSQL = strSQL & " WHERE "...
End If
Next tdf
这是技术部分。这里的主要问题是同步方法。在 Data-Base Concurrency control
上搜索
我有一个 MS Access (2010) 应用程序通过链接表链接到 SQL Server (2012)。有什么方法可以让用户离线工作并在连接时同步到服务器?
提前致谢
在我看来,没有简单的方法可以做到这一点。
根据设计,我会将 SQL-Server 的相关内容镜像到本地访问数据库,并让访问程序使用该数据库。
但是 您需要找到一种方法将离线数据与 SQL-服务器同步。这是棘手的部分,它高度依赖于应用程序的设计目的。
对于来自 SQL 的 Access 中的只读数据,当然,只需要一个宏将 SQL table 的副本提取到用户运行的 Access 数据库中在离线之前刷新他们的副本。
如果有多个用户使用相同的数据,将更改同步回 SQL 服务器会变得更加复杂。同一条记录多次修改时,谁的'data'优先?
如果您的用户只添加数据,您可以设计一个持有 table 来保存新记录并让他们启动一个宏以将这些插入推送到 SQL table 并在他们使用时获取 SQL table 的新副本。但如前所述,如果他们正在编辑记录并且多个用户正在这样做,这很容易导致数据丢失和数据损坏。
方法是将 tables 链接到 2 个数据库上的 tables:链接到 SQL 服务器,链接到本地副本 Access 数据库文件。
- 您将日期从远程数据库复制到本地数据库
- 让用户处理本地副本
- 将数据同步回远程数据库
如果您使用相同的名称保留本地 table,并为指向远程 table 名称("Remote" 或 "rmt")的链接添加一些前缀,您可以保持你们大多数人的逻辑:你们仍然处理相同的 tables,只是链接到不同的位置。 您的主要问题仍然是同步。你得想办法了,要看本系统的数据流向。
在这种情况下,一般同步代码为:
For Each tdf In CurrentDb.TableDefs
If Left (tdf.name, 3) = "rmt" then
CurrentDB.Execuet "DELETE FROM " & tdf.name
CurrentDB.Execuet "INSERT INTO " & tdf.name & " SELECT * FROM " & Mid (tdf.name, 4)
End If
Next tdf
此代码从远程数据库中删除所有数据,并从本地数据库中插入数据。查看这是否是您需要的同步方法,或者您应该修改代码以满足您的需要。向每个 table 中的每个记录添加一个 LastUpdate
字段(并在每次数据修改时对其进行更新),可以支持良好的同步决策制定:删除哪些记录 , 以及 Insert 的内容,并在上述语句中添加适当的 WHERE
子句。
你也可以有一个通用 UPDATE
SQL 假设每个 table 的主键被命名为 table 名称,带有 "ID" 前缀:
Dim strSQL As String, srsbl As String, PK As String
Dim tdf As DAO.TableDef, fld As DAO.Field
For Each tdf In CurrentDb.TableDefs
if Left (tdf.name, 3) = "rmt" then
srsTbl = Mid (tdf.name, 4)
PK = "ID" & srsTbl
strSQL = "UPDATE " & tdf.name & " Inner Join " & srsTbl & " ON " & tdf.name & "." & PK & " = " & srsTbl & "." & PK & " SET "
For Each fld in tdf.Fields
if fld.Name <> PK then
strSQL = strSQL & tdf.name & "." & fld.Name & " = " & srsTbl & "." & fld.Name & ", "
End If
Next
' Remove Last comma:
strSQL = Left (strSQL, Len(strSQL) - Len(","))
' strSQL = strSQL & " WHERE "...
End If
Next tdf
这是技术部分。这里的主要问题是同步方法。在 Data-Base Concurrency control
上搜索