![](/img/trans.png)
[英]MS Access 97 application working directly with MS SQL Server 2005
[英]MS Access Application Work offline
我有一个通过链接表链接到SQL Server(2012)的MS Access(2010)应用程序。 有什么方法可以让用户脱机工作并在连接后同步到服务器?
提前致谢
在我看来,没有简单的方法可以做到这一点。
通过设计,我会将SQL Server的相关内容镜像到本地访问数据库,并使访问程序可以与此数据库一起工作。
但是您需要找到一种方法来将脱机数据与SQL Server同步。 那是棘手的部分,它在很大程度上取决于应用程序设计的目的。
当然,对于Access from SQL中的只读数据,只需有一个宏即可将SQL表的副本拉到用户运行的Access数据库中,以在离线之前刷新其副本。
如果有多个用户使用同一数据,则将更改同步回SQL Server变得更加复杂。 当同一记录有多个更改时,谁的“数据”优先?
如果您的用户仅添加数据,则可以设计一个保存表来保存新记录,并让它们启动一个宏以将这些插入内容推入SQL表,并在它们插入时获得SQL表的新副本。 但是,如上所述,如果他们正在编辑记录并且有多个用户这样做,那么很容易导致数据丢失和数据损坏。
实现此方法的方法是将表链接到2个DB上的表:SQL Server和本地副本Access DB文件。
如果您使用相同的名称保留本地表,并在指向远程表名称的链接(“ Remote”或“ rmt”)中添加一些前缀,则可以保持大多数逻辑:您仍在处理相同的表,只是链接到其他表位置。 您的主要问题仍然是同步 。 您需要考虑一种方法,具体取决于该系统中的数据流。
在这种情况下,一般的同步代码为:
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
此代码从远程数据库删除所有数据,而是从本地数据库插入数据。 查看这是否是您需要的同步方法,或者应该修改代码以适合您的需求。 向每个表中的每个记录添加LastUpdate
字段(并在每次数据修改时对其进行更新)可以支持良好的同步决策:将哪些记录删除 ,将哪些记录插入 ,并在上述语句中添加适当的WHERE
子句。
您还可以将每个表的常规UPDATE
SQL 假定主键命名为表名,并带有“ 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
这是技术部分。 这里的主要问题是同步方法。 搜索数据库并发控制
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.