MS Access应用程序离线工作

时间:2016-05-24 11:39:34

标签: sql-server ms-access offlineapps

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

提前致谢

3 个答案:

答案 0 :(得分:2)

在我的观点中,没有简单的方法可以做到这一点。

按照设计,我会将SQL-Server的相关内容镜像到本地访问数据库,并让访问程序与该数据库一起使用。

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

答案 1 :(得分:1)

对于来自SQL的Access中的只读数据,当然,只需要一个宏将SQL表的副本提取到用户运行的Access数据库中,以便在脱机之前刷新其副本。

如果有相同数据的多个用户,则将更改同步回SQL Server会变得更加复杂。当同一记录有多处变更时,谁的'数据'优先?

如果您的用户仅添加数据,您可以设计一个保留表来保存新记录并让它们启动宏以将这些插入推送到SQL表并获取SQL表的新副本在它。但如上所述,如果他们正在编辑记录而多个用户正在这样做,这可能会很容易导致数据丢失和数据损坏。

答案 2 :(得分:1)

执行此操作的方法是将表链接到2个DB上的表:SQL服务器和本地副本Access DB文件。

  1. 您将日期从远程复制到本地数据库
  2. 让用户使用本地副本
  3. 将数据同步回远程数据库
  4. 如果保持本地表具有相同的名称,并为远程表名称(“远程”或“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

    上搜索