如何实时将 Dbase 数据库复制到 MYSQL?
How do you replicate a Dbase database to MYSQL in real time?
我有一个庞大的 dBase 数据库 (Visual FoxPro vfp)。我需要将它实时复制到 Mysql 数据库。
为了提供帮助,我制作了一个 c# 服务,通过在每个 Mysql table 然后从每个 dBase DB table 再次插入所有内容。但是,这很难称为复制,而且对于较大的 dBase tables.
,它的性能极差
我无法直接使用VFP 文件修改程序。我只能访问数据库文件本身。
我怎样才能以有效的方式实时或接近实时地完成上述任务?
实际上 VFP *.DBC 数据库容器支持触发器。在 Vfp IDE 中,您可以使用 Modify Database
命令,然后在数据库设计器或
中交互操作
CREATE TRIGGER ON myTable FOR DELETE|INSERT|UPDATE AS myTrigger()
在命令中 Window。
另见 create a trigger for update, delete or insert in FoxPro Table
和 Create FoxPro Trigger
[编辑]
在触发器的 Stored Procedure
代码中,您可以使用 FoxPro SQL 直通 SPT 代码,即 VfP 的 SQL*() 函数,如 SQL(String)Connect()
、SQLExec()
或 Remote Views
或 CursorAdapters
将向您的 MySQL 服务器发送(参数化)SQL 语句。
示例:
LOCAL lcConnString
IF m.llSuccess
lcConnString = ;
[DRIVER=MySQL ODBC 5.1 Driver;] + ;
[USER=] + m.lcUser + [;] + ;
[PASSWORD=] + m.lcPwd + [;] + ;
[DATABASE=Test;] + ;
[SERVER=] + m.lcServer+ [;] + ;
[OPTION=3;]
ENDIF
PUBLIC h
IF m.llSuccess
h = SQLSTRINGCONNECT(m.lcConnstring)
llSuccess = ( h > 0 )
lcErrorMessage = "Connection failed."
ENDIF
Local lnPk, lnValue, lcSQL, lnSuccess, laSQLErrors[1]
IF m.llSuccess
lnPk = 15887
lnValue = 15
lcSQL = "Insert Into test (primaryKey, testInt) Values (?m.lnPk, ?m.lnValue)"
lnSuccess = SqlExec(h,m.lcSQL)
llSuccess = ( m.lnSuccess > 0 )
IF m.lnSuccess < 1
AERROR(laSQLErrors)
lcErrorMessage = ;
TRANSFORM(laSQLErrors[1]) + ", " + ;
TRANSFORM(laSQLErrors[2])
ENDIF
ENDIF
IF h > 0
SQLDISCONNECT(h)
ENDIF
至于商业 CData 3rd 方工具,他们提供了一个 xBase/dBase 驱动程序
https://www.cdata.com/drivers/xbase/
以及我还没有尝试过的“通用数据管道”复制工具:
https://www.cdata.com/sync/ ,
https://www.cdata.com/sync/#purchase
很久以前,我使用以下方法做了类似的事情:我创建了触发器来记录到 table 所操作记录的 ID。然后我将定期例程设置为每隔几分钟 运行,读取日志并将实际记录值发送到云中的 Postgres 目标数据库。
首先,检查DBC中的tables是否有一些方法来唯一标识每条记录,你可以尝试在这些tables上创建触发器,捕获每次它们被更改(添加、更新或删除记录)并将该记录的标识(可能是 table 的主键的值)记录到 LOG table。此日志 table 可能是这样的:
SYNC_LOG.DBF 字段:
table(字符)
键(Char 或 Int 或系统使用的其他内容)
操作(字符)“插入”或“更新”或“删除”
已处理的布尔值(假或真)
因此,每次插入、更新或删除同一 table 中的记录时,触发器都会将操作记录到 SYNC_LOG.DBF,将“已处理”字段设置为 FALSE。
如果该记录的日志已经存在并且尚未处理,则触发器不需要创建新日志。定义此规则可确保日志文件不会无限期地变大。
这是第一部分。第二个是创建一个例程,该例程将定期检查 de 日志文件并发送命令以更新 de-destination 数据库。
所有这些都可以在 VFP 中 100% 轻松完成,但我不知道你对狐狸的了解。
我有一个庞大的 dBase 数据库 (Visual FoxPro vfp)。我需要将它实时复制到 Mysql 数据库。
为了提供帮助,我制作了一个 c# 服务,通过在每个 Mysql table 然后从每个 dBase DB table 再次插入所有内容。但是,这很难称为复制,而且对于较大的 dBase tables.
,它的性能极差我无法直接使用VFP 文件修改程序。我只能访问数据库文件本身。
我怎样才能以有效的方式实时或接近实时地完成上述任务?
实际上 VFP *.DBC 数据库容器支持触发器。在 Vfp IDE 中,您可以使用 Modify Database
命令,然后在数据库设计器或
CREATE TRIGGER ON myTable FOR DELETE|INSERT|UPDATE AS myTrigger()
在命令中 Window。 另见 create a trigger for update, delete or insert in FoxPro Table 和 Create FoxPro Trigger
[编辑]
在触发器的 Stored Procedure
代码中,您可以使用 FoxPro SQL 直通 SPT 代码,即 VfP 的 SQL*() 函数,如 SQL(String)Connect()
、SQLExec()
或 Remote Views
或 CursorAdapters
将向您的 MySQL 服务器发送(参数化)SQL 语句。
示例:
LOCAL lcConnString
IF m.llSuccess
lcConnString = ;
[DRIVER=MySQL ODBC 5.1 Driver;] + ;
[USER=] + m.lcUser + [;] + ;
[PASSWORD=] + m.lcPwd + [;] + ;
[DATABASE=Test;] + ;
[SERVER=] + m.lcServer+ [;] + ;
[OPTION=3;]
ENDIF
PUBLIC h
IF m.llSuccess
h = SQLSTRINGCONNECT(m.lcConnstring)
llSuccess = ( h > 0 )
lcErrorMessage = "Connection failed."
ENDIF
Local lnPk, lnValue, lcSQL, lnSuccess, laSQLErrors[1]
IF m.llSuccess
lnPk = 15887
lnValue = 15
lcSQL = "Insert Into test (primaryKey, testInt) Values (?m.lnPk, ?m.lnValue)"
lnSuccess = SqlExec(h,m.lcSQL)
llSuccess = ( m.lnSuccess > 0 )
IF m.lnSuccess < 1
AERROR(laSQLErrors)
lcErrorMessage = ;
TRANSFORM(laSQLErrors[1]) + ", " + ;
TRANSFORM(laSQLErrors[2])
ENDIF
ENDIF
IF h > 0
SQLDISCONNECT(h)
ENDIF
至于商业 CData 3rd 方工具,他们提供了一个 xBase/dBase 驱动程序 https://www.cdata.com/drivers/xbase/ 以及我还没有尝试过的“通用数据管道”复制工具: https://www.cdata.com/sync/ , https://www.cdata.com/sync/#purchase
很久以前,我使用以下方法做了类似的事情:我创建了触发器来记录到 table 所操作记录的 ID。然后我将定期例程设置为每隔几分钟 运行,读取日志并将实际记录值发送到云中的 Postgres 目标数据库。
首先,检查DBC中的tables是否有一些方法来唯一标识每条记录,你可以尝试在这些tables上创建触发器,捕获每次它们被更改(添加、更新或删除记录)并将该记录的标识(可能是 table 的主键的值)记录到 LOG table。此日志 table 可能是这样的:
SYNC_LOG.DBF 字段: table(字符) 键(Char 或 Int 或系统使用的其他内容) 操作(字符)“插入”或“更新”或“删除” 已处理的布尔值(假或真)
因此,每次插入、更新或删除同一 table 中的记录时,触发器都会将操作记录到 SYNC_LOG.DBF,将“已处理”字段设置为 FALSE。
如果该记录的日志已经存在并且尚未处理,则触发器不需要创建新日志。定义此规则可确保日志文件不会无限期地变大。
这是第一部分。第二个是创建一个例程,该例程将定期检查 de 日志文件并发送命令以更新 de-destination 数据库。
所有这些都可以在 VFP 中 100% 轻松完成,但我不知道你对狐狸的了解。