![](/img/trans.png)
[英]MS Access 97 application working directly with MS SQL Server 2005
[英]MS Access Application Work offline
我有一個通過鏈接表鏈接到SQL Server(2012)的MS Access(2010)應用程序。 有什么方法可以讓用戶脫機工作並在連接后同步到服務器?
提前致謝
在我看來,沒有簡單的方法可以做到這一點。
通過設計,我會將SQL Server的相關內容鏡像到本地訪問數據庫,並使訪問程序可以與此數據庫一起工作。
但是您需要找到一種方法來將脫機數據與SQL Server同步。 那是棘手的部分,它在很大程度上取決於應用程序設計的目的。
當然,對於Access from SQL中的只讀數據,只需有一個宏即可將SQL表的副本拉到用戶運行的Access數據庫中,以在離線之前刷新其副本。
如果有多個用戶使用同一數據,則將更改同步回SQL Server變得更加復雜。 當同一記錄有多個更改時,誰的“數據”優先?
如果您的用戶僅添加數據,則可以設計一個保存表來保存新記錄,並讓它們啟動一個宏以將這些插入內容推入SQL表,並在它們插入時獲得SQL表的新副本。 但是,如上所述,如果他們正在編輯記錄並且有多個用戶這樣做,那么很容易導致數據丟失和數據損壞。
實現此方法的方法是將表鏈接到2個DB上的表:SQL Server和本地副本Access DB文件。
如果您使用相同的名稱保留本地表,並在指向遠程表名稱的鏈接(“ Remote”或“ 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
這是技術部分。 這里的主要問題是同步方法。 搜索數據庫並發控制
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.