我有一个大型的dBase DB (Visual )。我需要实时地将它复制到Mysql。
为了提供帮助,我创建了一个c#服务,通过在每个Mysql表中执行一个完整的删除操作,将特定表中的全部信息从dBase转储到Mysql,然后再次从每个dBase DB表中插入所有信息。但是,这很难被称为复制,对于较大的dBase表来说,它的性能非常差。
我无法直接使用VFP文件修改程序。我只能访问数据库文件本身。
如何有效地、真实地或接近实时地完成上述任务?
发布于 2021-12-14 08:45:06
实际上,VFP *.DBC数据库容器支持触发器。在Vfp中,您可以使用Modify Database
命令,然后在数据库设计器或
CREATE TRIGGER ON myTable FOR DELETE|INSERT|UPDATE AS myTrigger()
在指挥窗口。另见在FoxPro表中创建用于更新、删除或插入的触发器和创建FoxPro触发器
在触发器的Stored Procedure
代码中进行编辑,您可以使用FoxPro SQL代码,即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第三方工具,它们提供了一个xBase/ dBase驱动程序https://www.cdata.com/drivers/xbase/以及一个我还没有尝试过的“通用数据管道”复制工具:https://www.cdata.com/sync/,https://www.cdata.com/sync/#purchase
发布于 2022-01-07 07:40:59
很久以前,我使用以下方法做了类似的事情:我创建了触发器,将操作的记录ID记录到表中。然后设置一个周期性例程,每隔几分钟运行一次,读取日志e,将实际的记录值发送到云中的Postgres目标数据库。
首先,检查DBC中的表是否有某种方法唯一地标识每条记录,您可以尝试在这些表上创建触发器,捕捉每次它们被更改(添加、更新或删除记录),并将该记录的标识(可能是表的主键的值)记录到日志表中。这个日志表可以是这样的:
SYNC_LOG.DBF字段:表(Char)键(Char或Int或系统使用的其他什么)操作(Char)“插入”或“更新”或“删除”处理的布尔值(假或真)
因此,每次插入、更新或删除同一表中的记录时,触发器都会将操作记录为SYNC_LOG.DBF,将“已处理”字段设置为FALSE。
如果该记录的日志已经存在且尚未处理,则触发器不需要创建新日志。定义此规则可以保证日志文件不会无限期地变大。
这是第一部分。第二种方法是创建一个例程,定期检查de文件,并发送命令更新取消目标数据库。
所有这些在VFP中都可以很容易做到,但是我不知道你对狐狸的了解。
https://stackoverflow.com/questions/70319441
复制相似问题