首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实时地将Dbase数据库复制到MYSQL?

如何实时地将Dbase数据库复制到MYSQL?
EN

Stack Overflow用户
提问于 2021-12-11 22:12:59
回答 2查看 376关注 0票数 0

我有一个大型的dBase DB (Visual )。我需要实时地将它复制到Mysql。

为了提供帮助,我创建了一个c#服务,通过在每个Mysql表中执行一个完整的删除操作,将特定表中的全部信息从dBase转储到Mysql,然后再次从每个dBase DB表中插入所有信息。但是,这很难被称为复制,对于较大的dBase表来说,它的性能非常差。

我无法直接使用VFP文件修改程序。我只能访问数据库文件本身。

如何有效地、真实地或接近实时地完成上述任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-14 16:45:06

实际上,VFP *.DBC数据库容器支持触发器。在Vfp中,您可以使用Modify Database命令,然后在数据库设计器或

代码语言:javascript
运行
复制
 CREATE TRIGGER ON myTable FOR DELETE|INSERT|UPDATE AS myTrigger()

在指挥窗口。另见在FoxPro表中创建用于更新、删除或插入的触发器创建FoxPro触发器

在触发器的Stored Procedure代码中进行编辑,您可以使用FoxPro SQL代码,即VfP的SQL*()函数,如SQL(String)Connect()SQLExec()Remote ViewsCursorAdapters,这些函数将向您的MySQL服务器发送(参数化) SQL语句。

示例:

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2022-01-07 15:40:59

很久以前,我使用以下方法做了类似的事情:我创建了触发器,将操作的记录ID记录到表中。然后设置一个周期性例程,每隔几分钟运行一次,读取日志e,将实际的记录值发送到云中的Postgres目标数据库。

首先,检查DBC中的表是否有某种方法唯一地标识每条记录,您可以尝试在这些表上创建触发器,捕捉每次它们被更改(添加、更新或删除记录),并将该记录的标识(可能是表的主键的值)记录到日志表中。这个日志表可以是这样的:

SYNC_LOG.DBF字段:表(Char)键(Char或Int或系统使用的其他什么)操作(Char)“插入”或“更新”或“删除”处理的布尔值(假或真)

因此,每次插入、更新或删除同一表中的记录时,触发器都会将操作记录为SYNC_LOG.DBF,将“已处理”字段设置为FALSE。

如果该记录的日志已经存在且尚未处理,则触发器不需要创建新日志。定义此规则可以保证日志文件不会无限期地变大。

这是第一部分。第二种方法是创建一个例程,定期检查de文件,并发送命令更新取消目标数据库。

所有这些在VFP中都可以很容易做到,但是我不知道你对狐狸的了解。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70319441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档