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

在mdb文件和MySQL服务器架构中的相似表之间同步数据,mysql,ms-access,Mysql,Ms Access,我正在寻找一种方法来管理应用程序的Access mdb文件与包含相同表副本的MySQL模式之间的同步。这是因为应用程序不支持MySQL作为后端,但我正在寻找一种方法,使用第一个应用程序生成的数据将MySQL用于其他办公室应用程序 一些赠品: 1> 我们不能放弃第一个应用程序,它只与Microsoft SQL Server兼容,作为存储数据的后端服务器 2> 我们并不反对使用Microsoft SQL server,但许可成本是一个大问题——以及重写其他一些使用链接表和单独mdb文件编写的Acce

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

一些赠品:

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

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

3> 数据库服务器应该是“PHP友好型”的,用于内部公司intraweb的未来扩展项目

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


我希望我不是太默默无闻,但我也不想破坏别人的信任——所以我试着走得很紧。如果有人能帮忙,我将不胜感激。

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

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

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

  • 查找新记录并将其附加到Access数据存储中。这很容易通过外部连接完成

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

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

  • 大概是这样的:

    UPDATE LocalTable
    SET LocalTable.Field1 = DownloadTable.Field2, LocalTable.Updated = DownloadTable.Updated
    WHERE LocalTable.Field1 <> DownloadTable.Field2
    
      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记录集中(仅用于遍历要更新的字段),您希望只包含可更新的字段,因此您可以省略已创建的字段和PK字段(以及不想更新的任何其他字段)

    现在,对于删除


    您可能认为删除本地表中不在远程表中的任何记录是个好主意。如果它真的是一个从数据库,那么这样做很好,但通常情况下,原本是从数据库的内容最终会得到自己的编辑。因此,在这种情况下,您不需要从主MySQL数据库中删除记录,而是需要一个delete标志来标记已删除的记录。您可以使用不同的逻辑来清除主数据库中已删除的记录(例如,如果您在记录中使用日期戳,您可以删除所有标记为“已删除”的记录,即如果两个数据库都需要更新,那么同步两个数据库非常非常复杂。如果一个数据库是另一个数据库的从数据库,这几乎没有那么困难。我不止一次编程过这种同步使用Access,一次与web服务器上的MDB同步,该MDB必须与本地数据MDB同步(合并在网站上编辑的数据;没有编辑返回到网站,因此单向同步,但仍然需要合并非web端的编辑),以及一次在网站上的MySQL和主数据库(MySQL)中的Access之间进行同步编程/slave(访问)关系

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

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

  • 查找新记录并将其附加到Access数据存储中。使用外部联接很容易做到这一点

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

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

  • 大概是这样的:

    UPDATE LocalTable
    SET LocalTable.Field1 = DownloadTable.Field2, LocalTable.Updated = DownloadTable.Updated
    WHERE LocalTable.Field1 <> DownloadTable.Field2
    
      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子句,但这很容易理解您希望只包含可更新的字段,因此可以省略已创建的字段和PK字段(以及不希望更新的任何其他字段)

    现在,对于删除

    您可能认为简单地删除本地表中不在远程表中的任何记录是一个好主意。如果它真的是一个从数据库,那么这样做很好,但通常情况下,它最初是一个从数据库