我有一个通过链接表链接到SQL Server(2012)的MS Access(2010)应用程序。有什么方法可以让用户脱机工作并在连接时同步到服务器?
提前致谢
答案 0 :(得分:2)
在我的观点中,没有简单的方法可以做到这一点。
按照设计,我会将SQL-Server的相关内容镜像到本地访问数据库,并让访问程序与该数据库一起使用。
但是您需要找到一种方法来将离线数据与SQL-Server同步。这是一个棘手的部分,它高度依赖于设计和应用程序的目的。
答案 1 :(得分:1)
对于来自SQL的Access中的只读数据,当然,只需要一个宏将SQL表的副本提取到用户运行的Access数据库中,以便在脱机之前刷新其副本。
如果有相同数据的多个用户,则将更改同步回SQL Server会变得更加复杂。当同一记录有多处变更时,谁的'数据'优先?
如果您的用户仅添加数据,您可以设计一个保留表来保存新记录并让它们启动宏以将这些插入推送到SQL表并获取SQL表的新副本在它。但如上所述,如果他们正在编辑记录而多个用户正在这样做,这可能会很容易导致数据丢失和数据损坏。
答案 2 :(得分:1)
执行此操作的方法是将表链接到2个DB上的表:SQL服务器和本地副本Access DB文件。
如果保持本地表具有相同的名称,并为远程表名称(“远程”或“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
这是技术部分。这里的主要问题是同步方法。在Data-Base Concurrency control
上搜索