目前我有一个问题,在笔记本电脑上使用多个(相同模式)访问 2003 数据库。
我需要找到一种将数据同步到中央访问数据库的自动化方法。
笔记本电脑上的数据仅附加到,因此更新/删除操作不会成为问题。
哪些工具可以让我轻松做到这一点?哪些因素会影响对最佳工具或解决方案的决定?
目前我有一个问题,在笔记本电脑上使用多个(相同模式)访问 2003 数据库。
我需要找到一种将数据同步到中央访问数据库的自动化方法。
笔记本电脑上的数据仅附加到,因此更新/删除操作不会成为问题。
哪些工具可以让我轻松做到这一点?哪些因素会影响对最佳工具或解决方案的决定?
访问复制可能很尴尬,并且由于您只需要附加查询并进行一些检查,因此最好自己编写一些东西。如果每台笔记本收集的数据不能重叠,这可能并不太难。
您将需要考虑主键。最好将用户名或笔记本电脑名称包含在密钥中,以确保记录正确关联。
可以使用 Access 中内置的 Jet 复制,但我会警告你,它非常不稳定。它还会在您执行的任何表上弄乱您的 PK,因为它会选择随机有符号整数来尝试避免密钥冲突,因此您最终可能会以 -1243482392912 作为给定记录上的下一个 PK。如果您正在对它进行任何类型的查找(如客户 ID、订单号等),这是一个要输入的 PITA。您无法自动化访问同步(也许您可以使用 VBA 伪造类似的东西。但仍然,只有在打开数据库时才会运行)。
我推荐的方法是在“中央”数据库上使用 SQL Server 2005/2008,并在“远程”数据库上使用 SQL Server Express Editions 作为后端,然后使用 Access 中的链接表连接到这些 SSEE 数据库和复制以同步它们。设置合并复制或快照复制,将您的“中央”数据库作为发布者,将您的 SSEE 数据库作为订阅者。与 Access Jet 复制不同,您可以控制 PK 编号,但对您而言,这不是问题,因为您的订阅者不会推送更改。
除了 SQL Server 带来的可扩展性之外,您还可以使用 Windows 同步管理器自动执行此操作(如果您有同步的文件夹,那就是在您登录/注销时弹出并同步它们的烦人的小框),并将其设置为它以给定的时间间隔、启动、关闭或一天中的某个时间和/或计算机空闲时同步,或仅按需同步。即使 Access 一个月没有运行,它的数据集也可以在您的用户每次连接到网络时更新。很酷的东西。
该线程中的答案充满了关于 Jet Replication 的错误信息,这些人显然没有使用它,只是重复他们听到的事情,或者将问题归咎于实际反映应用程序设计错误的 Jet Replication。
可以使用 Access 中内置的 Jet 复制,但我会警告你,它非常不稳定。
Jet Replication 并非易事。如果使用得当,它是完全可靠的,就像任何其他复杂的工具一样。确实,在非复制数据库中不会导致任何问题的某些事情在复制时可能会导致问题,但这是有道理的,因为任何数据库引擎都需要进行复制。
它还会在您执行的任何表上弄乱您的 PK,因为它会选择随机有符号整数来尝试避免密钥冲突,因此您最终可能会以 -1243482392912 作为给定记录上的下一个 PK。如果您正在对它进行任何类型的查找(如客户 ID、订单号等),则可以输入 PITA。
代理自动编号 PK 不应该首先暴露给用户。它们是用于在幕后加入记录的无意义数字,如果您将它们暴露给用户,那是您的应用程序设计中的错误。
如果您确实需要序列号,则必须自己滚动并处理如何防止副本之间发生冲突的问题。但这对于任何数据库引擎中的复制都是一个问题。SQL Server 提供了在数据库引擎级别为单个副本分配序列号块的功能,这是一个非常好的功能,但它的代价是维护多个 SQL Server 实例会增加管理开销(存在所有安全性和性能问题)这需要)。在 Jet Replication 中,您必须在代码中执行此操作,但这并不是一个复杂的问题。
另一种选择是使用复合 PK,其中一列指示源副本。
但这并不是 Jet 的复制实现中的一些缺陷——对于任何需要有意义的序列号的复制场景来说,这都是一个问题。
您无法自动执行 Access 同步(也许您可以使用 VBA 伪造类似的东西。但是,只有在打开数据库时才会运行)。
这显然是不真实的。如果您安装 Jet 同步器,您可以安排同步(直接、间接或 Internet 同步)。即使没有它,您也可以安排 VBScript 定期运行并进行同步。这些只是无需打开 Access 应用程序即可完成自动 Jet 同步的两种方法。
来自 MS 文档的引用:
使用 Jet 和复制对象
JRO 确实不是管理 Jet Replication 的最佳方式。一方面,它只有一个 DAO 本身缺乏的功能,即在代码中启动间接同步的能力。但是,如果您要向应用程序添加依赖项(JRO 需要引用,或者可以通过后期绑定使用),您不妨添加对真正有用的库的依赖项以控制 Jet Replication,这就是TSI Synchronizer,由迈克尔·卡普兰(Michael Kaplan)创建,他曾经是世界上最重要的 Jet 复制专家(此后他将国际化作为他的专注领域)。它使您可以完全以编程方式控制 Jet 公开的几乎所有复制功能,包括调度同步、启动各种同步以及急需的 MoveReplica 命令(在不中断复制的情况下移动或重命名副本的唯一合法方法)。
JRO 是微软流产的 ADO-Everywhere 运动的丑陋继子之一。其目的是提供特定于 Jet 的功能来补充 ADO 本身所支持的功能。如果您不使用 ADO(并且您不应该在带有 Jet 后端的 Access 应用程序中),那么您并不想使用 JRO。正如我上面所说,它只添加了一个 DAO 中尚不可用的功能(即,启动间接同步)。我不禁认为微软为 Jet 特定的功能创建了一个独立的库,然后故意遗漏了他们本来可以支持的所有非常有用的功能。
现在我已经处理了上面提供的答案中的错误断言,这是我的建议:
因为你有一个只追加的基础设施,所以按照@Remou 的建议去做,并设置一些东西来手动将新记录发送到他们需要去的任何地方。他说得对,你仍然必须处理 PK 问题,就像使用 Jet Replication 一样。这是因为这是在多个位置添加新记录的要求所必需的,并且对于所有复制/同步应用程序都是通用的。
但有一点需要注意:如果将来仅添加的场景发生变化,您将不得不从头开始或编写一大堆毛茸茸的代码来管理删除和更新(这并不容易——相信我,我'已经做到了!)。仅使用 Jet Replication 的一个优点(尽管它对于双向同步最有价值,即在多个位置进行编辑)是它可以毫无问题地处理仅添加方案,然后在它变成未来的一个要求。
最后,Jet Replication 的一个好起点是Jet Replication Wiki。资源、最佳实践和不相信的事情页面可能是最好的起点。
您应该阅读Access Database Replication,因为那里有一些信息。
但我认为,为了让它与您的应用程序正常工作,您必须使用为此可用的方法和属性推出定制的解决方案。
如果您需要对 Microsoft Access 数据库(仅限 .mdb 文件)中副本集成员之间的数据和设计信息交换进行编程控制,请使用 Jet 和复制对象 (JRO)。例如,您可以使用 JRO 编写一个在用户打开数据库时自动将用户的副本与集合的其余部分同步的过程。要以编程方式复制数据库,必须关闭数据库。
如果您的数据库是使用 Microsoft Access 97 或更早版本创建的,则必须使用数据访问对象 (DAO) 以编程方式复制和同步它。
您可以使用 DAO 方法和属性在以前版本的 Microsoft Access 中创建和维护复制数据库。如果您需要对副本集成员之间的数据和设计信息交换进行编程控制,请使用 DAO。例如,您可以使用 DAO 编写一个在用户打开数据库时自动将用户的副本与集合的其余部分同步的过程。
您可以使用以下方法和属性来创建和维护复制数据库:
MakeReplica
方法Synchronize
方法ConflictTable
财产DesignMasterID
财产KeepLocal
财产Replicable
财产ReplicaID
财产ReplicationConflictFunction
财产Microsoft Jet 为创建和维护部分副本(包含完整副本中的记录子集的副本)提供了这些附加方法和属性:
ReplicaFilter
财产PartialReplica
财产PopulatePartial
方法
您绝对应该阅读文档的同步数据部分。
我在 a00 中使用复制多年,直到被迫升级到 a07(当它消失时)。在企业层面,我们遇到的最大问题是管理冲突。如果管理不及时,或者数量太多,用户会感到沮丧,数据变得不可靠。
当我们的远程站点并不总是连接到 Internet 时,复制运行良好。这使他们能够处理他们的数据,并在可能的时候进行同步。每天至少两次。
我们在管理同步的远程计算机上安装了一个单独的数据库,因此用户只需单击桌面上的图标即可触发同步。
用户有一个单独的按钮来推/拉来自指定 FTP 文件的提要,该文件将从旧系统更新。
这个过程运行良好,因为我们有 30 个这样的“节点”在全国各地工作,管理他们的数据并更新到 FTP 服务器。
如果您正在认真考虑这条道路,请告诉我,我可以将我的文档发送给您。
您可以编写自己的连接到笔记本电脑的同步软件,从它的数据库中选择差异并将其插入主服务器。此操作的难易程度取决于您的数据方案。(如果您有许多带有 FK 的表......您需要巧妙地做到这一点)。我认为如果您自己编写它将是最有效的。
将这种行为自动化称为复制,Accesss显然支持这种行为,但我从未见过它实现过。
我猜大多数时候笔记本电脑都没有连接到主数据库,无论如何(复制数据)都不是一个好主意。
如果您要寻找第 3 方工具来做到这一点 - 寻找可以在复制之前轻松地在表之间进行差异的东西,并且当然可以增量地做到这一点。
FWIW: