我正在进行一项研究,我们将使用 Access 收集数据。由于将有多个人使用相同的结构化 Access DB 进行这些研究,因此我们需要找到一种方法来使用从所有其他数据库收集的信息更新/同步到中央数据库。换句话说,需要将多个人收集的数据收集到一个中心区域。我该怎么做?
本质上这正是我想做的但不知道怎么做:
间接同步
当您在断开连接的环境中工作时(例如携带笔记本电脑旅行时),间接同步很有用。
间接同步只能使用 Replication Manager 进行配置。使用 Replication Manager 配置间接同步后,您可以使用 Microsoft Access、Replication Manager 或 JRO 执行间接同步。
答案1
我知道最可靠的方法是编写一个程序,与文件服务器上的数据库一起工作。我不得不为一个只想使用 MS Access 的客户(从头开始)编写一个程序来做到这一点。不幸的是,这里解释起来太棘手了。如果你能从多个地方访问 Access 数据库文件,MS Access 软件应该能够进行更改,但我不知道这些更改是否会传播到其他系统,或者它的可靠性如何。
答案2
请参阅此文章:将多个 MS Access 数据库合并为一个:
下面是用 MS Access VBA 编写的 Merge() 函数,用于将多个通常结构化的数据库合并为一个数据库。我必须为我的一个项目编写此函数,因为我需要合并许多孤岛数据库。数据库的结构完全相同。
当无法插入数据时,您将收到警告,因为它们将创建重复记录。在这种情况下,只需忽略警告消息并继续即可。
脚本本身只是循环执行如下命令:
INSERT INTO target SELECT * FROM source
由于原始网络服务器似乎已损坏,因此从回溯机器并转载于此:
Option Compare Database
Option Explicit
'Set the below variable to TRUE
'When you are done with testing
'Basically testing mode will print
'the names of all the databases
'you are going to merge
Const bTest = False
Sub Merge()
'Copyright © iLoveCoding, 2010
'Web: http://www.iLoveCoding.co.uk
'The Merege() is a function that merges
'records from multiple MS Access databases
'into a consolidated one provided that the
'structure of all databases are exactly same.
'
'This function assumes that there are
'no relationships defined among the tables.
'Which is typically the scenario when an
'MS Access database is used in an Intranet or
'Web application.
'However properly altering the order of the
'dbfiles() initialization one can easily
'address the issue of relationships and
'data integrity among tables
On Error GoTo errhand
Dim appPath$
'----------------------------------------------
'Change the below number to number of databases
'you are going to merge
'----------------------------------------------
Const ndb = 22
Dim dbfiles$(2 To ndb)
Dim i%
'ANA.mdb
'----------------------------------------------
'Array of the database file names without path
'Copy this code into a module of the first database
'The first database is going to be the consolidated
'capturing the records from all other databases.
'The first database name is not present here
'That is why the index starts with 2.
'----------------------------------------------
dbfiles(2) = "second.mdb" '<= change the file name
dbfiles(3) = "third.mdb"
dbfiles(4) = "fourth.mdb"
'
'similarly initialize other files
'
dbfiles(10) = "tenth.mdb"
'----------------------------------------------
' The databases should be copied to the same
' folder of the first database
'----------------------------------------------
appPath = CurrentProject.Path
For i = 2 To ndb
Dim dbpath$, db As Database
dbpath = appPath & "\" & dbfiles(i)
Set db = OpenDatabase(dbpath)
Dim tbl As TableDef, j%
For j = 0 To db.TableDefs.Count - 1
DoEvents
Set tbl = db.TableDefs(j)
If tbl.Attributes = 0 Then
If bTest Then
Debug.Print tbl.Name
Else
DoCmd.TransferDatabase acLink, "Microsoft Access", _
dbpath, acTable, tbl.Name, tbl.Name & "_Linked", False
Dim sql$
sql = "INSERT INTO [" & tbl.Name & "] SELECT * FROM [" & _
tbl.Name & "_Linked" & "]"
DoCmd.RunSQL sql
DoCmd.DeleteObject acTable, tbl.Name & "_Linked"
End If
End If
Next j
Debug.Print dbfiles(i)
Next i
Exit Sub
errhand:
MsgBox Err.Description
End Sub
答案3
某物相似的已经在 StackOverflow 上讨论过了,也许它可以给你一些关于如何继续的指示。
另一个可能超出你预算的选择可能是Altova 数据库间谍,它可以将CSV/XML数据导入到Access数据库中。
答案4
如果这样做,可以通过创建具有随机数主键的表来完成同步。如果使用“自动编号”键,则两个用户输入数据将导致重复记录主键冲突。
然后可以使用附加查询在实例之间进行同步。
由于 HIPAA 要求,我在 sync.com 上同步我的数据。到目前为止,我还没有遇到过记录冲突。