2016-05-24 73 views
1

我有一个MS Access(2010)通过链接表连接到SQL Server(2012)的应用程序。有什么方法可以让用户在离线状态下工作并在连接时同步到服务器?MS Access应用程序脱机工作

在此先感谢

回答

1

的方法来做到这一点是有2个DB的链接表到表:到SQL服务器,并且本地副本Access数据库文件。

  1. 你从远程复制日期到本地数据库
  2. 对本地副本用户工作
  3. 同步数据备份到远程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 

此代码删除从远程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上搜索

2

在我的意见是没有简单的方法来做到这一点。

在设计上,我会在SQL-服务器的相关内容镜像到本地接入数据库,让这个数据库的访问程序的工作。

但是您需要找到一种将脱机数据与SQL-Server同步的方法。这是一个棘手的部分,高度依赖于您的应用程序的设计目的。从SQL访问

1

对于只读数据,当然,只是有一个宏来拉SQL表的复制到用户运行前都要离线刷新其复制Access数据库。

如果有相同数据的多个用户,虽然它变得更加复杂同步更改回SQL服务器。当同一个记录有多个变更时,谁的'数据'优先?

如果您的用户只添加数据,您可以设计一个保留表来保存新记录,让他们启动一个宏以将这些插入推送到SQL表,并获得SQL表的新副本在这里。但如前所述,如果他们正在编辑记录,并且多个用户正在这样做,那么这可能最终导致丢失的数据和数据损坏。

相关问题