在mdb文件和MySQL服务器模式中的相似表之间同步数据

时间:2009-04-20 20:41:50

标签: mysql ms-access

我正在寻找一种方法来管理应用程序的Access mdb文件和包含相同表的副本的MySQL架构之间的同步。这是因为应用程序不支持MySQL作为后端,但我正在寻找一种方法,利用第一个应用程序生成的数据将MySQL用于其他办公室应用程序。

一些让步:

1>我们不能放弃第一个应用程序,它只与Microsoft SQL Server兼容,作为容纳数据的后端服务器。

2 - ;我们并不反对使用Microsoft SQL服务器,但许可成本是一个大问题 - 以及重写​​一些其他使用链接表和单独的mdb文件编写的Access应用程序。

3>对于内部企业intraweb的未来扩展项目,数据库服务器应该是“PHP友好的”。

4>不需要,也不应该允许从公司网络外部访问数据。

我希望我不会太晦涩,但我也不想打破信心 - 所以我试着走得很紧。如果有人可以提供帮助,我将非常感激。

1 个答案:

答案 0 :(得分:3)

如果两个数据库都需要可更新,则同步两个数据库非常非常复杂。如果一个人是另一个人的奴隶,那就不那么困难了。我不止一次使用Access编程这种同步,一次在Web服务器上使用MDB,必须与本地数据MDB同步(以合并在网站上编辑的数据;没有编辑返回到网站,所以单向同步,但仍然需要在非网络上合并编辑),以及在网站上的MySQL和主(MySQL)/从(Access)关系中的Access之间编程同步。

在网站上,您将每个表的数据转储编程为文本文件。在MySQL表中设置时间戳字段是有帮助的,这样您就可以知道何时创建和更新记录。这允许您选择自上次数据转储以来要转储的记录(这使得Access端的数据同步更加简单)。

我编程的方式是将文本文件导入到适当索引并链接到前端Access应用程序的临时表中。将数据转储导入到临时表后,您将有三个任务:

  1. 找到新记录并将其附加到Access数据存储。这可以通过外部联接轻松完成。

  2. 处理删除。我稍后会讨论这个问题,因为它很复杂。

  3. 处理更新的记录。为此,我编写了可以编写逐列SQL语句的DAO代码。

  4. 这样的事情:

    UPDATE LocalTable
    SET LocalTable.Field1 = DownloadTable.Field2, LocalTable.Updated = DownloadTable.Updated
    WHERE LocalTable.Field1 <> DownloadTable.Field2
    

    现在,很明显,WHERE子句必须比这更复杂(你必须处理NULL,你必须使用适合数据类型的标准,即用“”和##作为文本和日期,分别没有数字数据的分隔符),但编写代码来做到这一点非常简单。

    骷髅代码看起来像这样:

      Dim db As DAO.Database
      Dim rsFields As DAO.Recordset
      Dim fld As DAO.Field
      Dim strSQL As String
    
      Set rsFields = db.OpenRecordset("SELECT TOP 1 Field1, Field2, Field3 FROM LocalTable;")
      For Each fld in rsFields
        [write your SQL statement and execute it]
      Next fld
      Set fld = Nothing
      rsFields.Close
      Set rsFields = Nothing
      Set db = Nothing
    

    现在,正如我所说,复杂的部分是为每个SQL语句编写WHERE子句,但这很容易理解。另请注意,在rsFields记录集(仅用于遍历要更新的字段)中,您只想包含可更新的字段,因此您将省略CREATED字段和PK字段(以及任何字段)您不想更新的其他字段。

    现在,对于DELETES。

    您可能认为删除本地表中不在远程表中的任何记录是个好主意。如果它确实是一个从属数据库,那么它可以正常工作,但通常最初的奴隶最终会获得自己的编辑。因此,在这种情况下,您需要从主MySQL数据库中删除记录,而是使用DELETE标志来标记已删除的记录。您可以使用不同种类的逻辑来清除主数据库中的已删除记录(例如,如果您在记录中使用日期戳,则可以删除标记为DELETED的所有记录,其中LastUpdated时间戳为&lt; =最后一次您转储数据;或者,您可以让Access应用程序向服务器发送文本文件,其中包含已从Access数据存储中成功删除的记录列表。如果Access数据存储中有编辑,那么您需要一些逻辑来处理从MySQL“主”数据库中删除的记录上的编辑。

    总结:

    如果你有真正的主/从关系,这是相当微不足道的。如果您真的想通过暴力破解,您只需将所有MySQL数据表的全部内容转储到文本文件中,删除Access数据存储中的所有记录并导入文本文件。

    我倾向于不这样做,因为当你第一次需要脱离纯粹的主/从关系时,你就会受到冲击并且必须从头开始重写所有东西。

    我上面给出的大纲对于主/从工作非常干净,但是如果你有一些专用于“slave”数据库的字段,或者存在于slave中但不存在于master中的数据,那么它也会很好用。 (这是我正在处理的情况)。