2016-05-24 72 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表的新副本在這裏。但如前所述,如果他們正在編輯記錄,並且多個用戶正在這樣做,那麼這可能最終導致丟失的數據和數據損壞。

相關問題