2009-04-20 45 views
0

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

一些已知条件:

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

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

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

4>公司网络以外的数据不需要,也不应该被允许。

我希望我不是太模糊,但我也不想破坏信心 - 所以我试图走一条非常紧的绳索。如果有人能帮忙,我会非常感激。

回答

3

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

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

我编程的方式是,然后将文本文件导入临时表,这些临时表被合适地编入索引并链接到前端Access应用程序。一旦数据转储导入到临时表,你再有三项任务:

  1. 找到新的记录,并把它们添加到访问数据存储。这很容易通过外部连接完成。

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

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

事情是这样的:

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

现在,很明显,在WHERE子句中有比这更复杂一些(你必须处理空值,你必须使用正确的格式标准对于数据类型,即,分别用“”和##代表文本和日期,数字数据没有分隔符),但编写代码很容易。

骨架代码看起来是这样的:

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数据库中删除记录,而是有一个删除标记,标记记录被删除。你可以有不同种类的逻辑,可以将已删除的记录清理出主数据库(例如,如果您在记录中使用日期戳记,则可以删除标记为LastUpdated timestamp的所有记录,即< =上次您记录的记录转储数据;或者,您可以让Access应用程序将文本文件发送到服务器,并使用已从Access数据存储中成功删除的记录列表)。如果Access数据存储中存在编辑,那么您需要一些逻辑来处理从MySQL“master”数据库中删除的记录中的编辑。

总结:

如果你有一个真正的主/从关系,这是相当琐碎。如果你真的想要通过强力执行,你只需将所有MySQL数据表的全部内容转储为文本文件,删除Access数据存储区中的所有记录并导入文本文件。

我倾向于不这样做,因为你第一次需要离开纯粹的主/从关系时,你会受到影响,不得不从头开始重写所有的东西。

我给出的上述提纲对于主/从机工作非常干净,但如果您有几个专用于“从机”数据库的字段或从机中存在的数据,而不是主人(这是我正在处理的情况)。

相关问题