gpt4 book ai didi

c++ - 使用嵌入式 mysql C++ 创建触发器

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:57 24 4
gpt4 key购买 nike

我在 Windows 上的 C++ 应用程序中使用 libmysqld c 库,以便与嵌入式 mysql 服务器接口(interface),即在嵌入它的进程的生命周期内在线的 mysql 服务器。创建数据库的应用程序使用 mysql .ini 文件创建相对于应用程序目录的数据目录,而不是在全局 mysql 安装文件夹中,例如

[libmysqld_server]
basedir=./
datadir=./Database

我可以毫无问题地以编程方式创建触发器,例如

status = mysql_query(mysql,
"CREATE TRIGGER del_trigger AFTER DELETE ON table FOR EACH ROW\
INSERT INTO otherTable (col1, col2) VALUES (OLD.col1, OLD.col2)\
");

if (status == 0) {
Log(DEBUG, "Initialize(): <%p> Delete Trigger creation passed ...", this);
}
else {
Log(DEBUG, "Initialize(): <%p> Delete Trigger creation failed with error %s...", this, mysql_error(mysql));
}

然而,我遇到的问题是,当触发器被调用时,mysql 会提示 mysql.proc 表不存在,因为我的应用程序特定数据目录中没有 mysql 数据库。我曾尝试从 C:\Program Files\MySQL 中的安装目录复制 mysql 文件夹...但是后来我遇到了 mysql 报告的问题

Error:Cannot load from mysql.proc. The table is probably corrupted

我看到的与上述错误相关的唯一建议是运行“mysql_upgrade”命令,该命令似乎不适用于使用其自己的数据目录的嵌入式数据库。我正在创建所有表并设置它们各自的触发器,但无法解决此 mysql.proc 错误。

更新:

我在这里也看到了一些不一致的行为。我的 MySQL 版本是“mysql-5.5.16-win32”,它带有一个 mysql_embedded.exe 二进制文件,我可以用它打开控制台并指向应用程序未运行时生成的数据库文件。当我在 mysql_embedded.exe 中执行操作时,触发器正常工作(没有“mysql.proc 可能已损坏”错误)。所以似乎只有 libmysqld c api 与 mysql 系统表有问题。

最佳答案

解决方案很简单,只需验证“mysql”数据库的版本是否与嵌入在 libmysqld 中的 mysql 版本相同。我通过以下方式验证了我的客户端版本信息:

const char * version = mysql_get_client_info();

这返回了“5.1.44”而不是我期望的“5.5.16”。下载 5.1.44 的 mysql ZIP 存档并使用 datadir 中的 mysql 数据库解决了我遇到的问题。

关于c++ - 使用嵌入式 mysql C++ 创建触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com