我有一个MS Access(2010)通过链接表连接到SQL Server(2012)的应用程序。有什么方法可以让用户在离线状态下工作并在连接时同步到服务器?MS Access应用程序脱机工作
在此先感谢
我有一个MS Access(2010)通过链接表连接到SQL Server(2012)的应用程序。有什么方法可以让用户在离线状态下工作并在连接时同步到服务器?MS Access应用程序脱机工作
在此先感谢
的方法来做到这一点是有2个DB的链接表到表:到SQL服务器,并且本地副本Access数据库文件。
如果保留本地表具有相同的名称,有些前缀链接添加到远程表名(“远程”或“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
此代码删除从远程DB的所有数据,并插入从本地数据库的数据来代替。看看这是否是您需要的同步方法,或者您应该修改代码以满足您的需求。添加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上搜索
在我的意见是没有简单的方法来做到这一点。
在设计上,我会在SQL-服务器的相关内容镜像到本地接入数据库,让这个数据库的访问程序的工作。
但是您需要找到一种将脱机数据与SQL-Server同步的方法。这是一个棘手的部分,高度依赖于您的应用程序的设计目的。从SQL访问
对于只读数据,当然,只是有一个宏来拉SQL表的复制到用户运行前都要离线刷新其复制Access数据库。
如果有相同数据的多个用户,虽然它变得更加复杂同步更改回SQL服务器。当同一个记录有多个变更时,谁的'数据'优先?
如果您的用户只添加数据,您可以设计一个保留表来保存新记录,让他们启动一个宏以将这些插入推送到SQL表,并获得SQL表的新副本在这里。但如前所述,如果他们正在编辑记录,并且多个用户正在这样做,那么这可能最终导致丢失的数据和数据损坏。