c++ - 嵌入式 MySQL 是否支持 Prepared 语句

标签 c++ mysql prepared-statement embedded-database

我通常使用实时服务器进行开发,但我第一次想到我会做出飞跃,看看我是否可以让我的所有 (C++) mysql 代码作为嵌入式服务器工作。特别是,我非常喜欢准备好的陈述,因为它们(恕我直言)“通常”优于未准备的品种。

我尝试过使用 5.5.22 的 libmysqld 和 5.6.4 的 libmysqld,但都不起作用。

连接已建立,简单的 mysql_query/mysql_real_query 命令可以正常工作,但是一旦我的第一个准备好的语句发出 mysql_stmt_fetch() 我就会得到讨厌的“命令不同步”错误。

在 oracles 论坛 (http://forums.mysql.com/read.php?168,507863,507863#msg-507863) 上出现了一个非常相似的问题,但没有得到解决。

我没有看到,也不相信我缺少 mysql_real_connect() 和 mysql_stmt_fetch() 之间的任何命令。

对于任何使用预准备语句的嵌入式服务器示例,我的所有搜索都是空的。我也没有找到一个实际的句子“你不能这样做”。

那么...是支持还是不支持?

感谢您的专业知识。

//编辑 为了进一步揭开这个神秘面纱(并在必要时指示)我的完整mysql cmd序列如下:

mysql_library_init();  // as embedded
mysql_init();
mysql_options(MYSQL_SET_CHARSET_NAME);  //to utf8
mysql_options(MYSQL_OPT_USE_EMBEDDED_CONNECTION);
mysql_real_connect();
mysql_real_query("SET NAMES 'utf8'");
mysql_real_query("SET CHARACTER SET 'utf8'");
mysql_set_character_set("utf8");  // yes, you really do need to set utf8 four times
mysql_autocommit( mAutocommit ); 

此时,mysql_real_query() 调用 DO 工作。我继续……

//all this would only happen once for each stmt
{
    mysql_stmt_init();
    mysql_stmt_prepare(theQuery);
    mysql_stmt_param_count(); // to assert input bind object (aka the predicates) has the same number of params as theQuery
    mysql_stmt_result_metadata()
    mysql_num_fields(); // to assert the output bind object has the same number of params as theQuery
    mysql_free_result(metadata);
    mysql_stmt_bind_param(); // called IF there are input params
    mysql_stmt_bind_result(); // pretty much always called for the output params
}
// and at last
mysql_stmt_execute();
//mysql_stmt_store_result();  //{OPTIONAL: use if you want to buffer the fetch - I dont}
mysql_stmt_fetch();   // ERROR! commands out of sync.

// and for completeness, 
mysql_stmt_free_result();
mysql_stmt_close();

// and the shutdown
mysql_close();
mysql_library_end();

最佳答案

我对此感到害怕.. 但是经过大量的工作,我对我的问题有了答案,并找到了问题的解决方案。 (是的,我是一个懒惰的程序员……我希望其他人会告诉我这一切都是必要的……呵呵)

这是我自己对嵌入式服务器 + 准备好的语句不起作用问题的权威回答。

问题:嵌入式是否支持 stmts?答案......他们应该是,但他们不是。

是的,嵌入式 mysql 中存在一个关于 stmts 的错误。看: http://bugs.mysql.com/bug.php?id=62136

齐周先生非常尊重我。他以某种方式确定在运行嵌入式时,mysql_stmt_execute() 错误地将结果状态设置为“MYSQL_STATUS_GET_RESULT”而不是“MYSQL_STATUS_STATEMENT_GET_RESULT”(即将 stmt 视为非语句)这显然会自然导致“命令不同步”错误。所以它需要对源代码本身进行修补。

如何做到这一点.. MySql“如何在 windows 上构建”页面:http://dev.mysql.com/doc/refman/5.5/en/source-installation.html

引用了这个更易于阅读的 HOW-TO-BUILD: http://www.chriscalender.com/?p=689

我在此过程中确定的其他 HOW-TO 注释

Chris 的操作方法适用于 VS2008 express。我使用 2010 Pro 并了解到 cmake -G arg 可以省略。对我来说,2010 年是自动确定要使用的编译器。

我只安装了 cmake 和 bison。 perl 和 bazaar 不是必需的。我得到了标准的 5.5.22 源发行版,而不是从集市中提取。

re: 安装野牛:

  • 确保将野牛安装到没有空格的路径
  • 不允许安装程序向开始菜单添加任何内容(导致“m4.exe 发现”错误)
  • 手动将 bison 的 bin 文件夹添加到系统 PATH 中

回复:signtool.exe

确保将 signtool 的路径添加到 PATH。示例(对我而言)

  • c:\Program Files\Microsoft SDKs\Windows\v7.0A\bin

下载MySql的源码发行版(http://dev.mysql.com/downloads/mysql/#downloads): Generic Linux (Architecture Independent), Compressed TAR Archive (mysql-5.5.22.tar.gz)

你需要编辑 {D:\your_path}\mysql-5.5.22\libmysqld\lib_sql.cc

在第 340 行你会看到:

if (res)
{
    NET *net= &stmt->mysql->net;
    set_stmt_errmsg(stmt, net);
    DBUG_RETURN(1);
}
//ADD CODE HERE
DBUG_RETURN(0);

在 if 代码块和 DBUG_RETURN(0) 之间插入以下内容:

//kgk 2012/04/11 - see http://bugs.mysql.com/bug.php?id=62136
//  Qi Zhou's modification to allow prep'd stmts to work
else if (stmt->mysql->status == MYSQL_STATUS_GET_RESULT)
{
    stmt->mysql->status= MYSQL_STATUS_STATEMENT_GET_RESULT;
}

并为自己构建一个新版本的 libmysqld.dll、libmysqld.lib、libmysqld.pdb

问题解决了。

当您构建了 dll 后,不要像我一样忘记将新的 DLL 移动到二进制文件的运行时文件夹,然后坐在那里想知道为什么更改没有做任何事情。叹息。

仅供引用:oracle 的技术人员的错误报告评论标记为 [20 Feb 18:34] Sveta Smirnova 完全是胡说八道。 serverARgs 与任何东西无关。

关于c++ - 嵌入式 MySQL 是否支持 Prepared 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930696/

相关文章:

c++ - "<<"和 ">>"在 C++ 中对于 cout/cin 意味着什么?

php - 通过php表单向mysql数据库添加多个条目

mysql - MySQL 是否在单个 DML 修改数据中使用事务并自动提交?

php - 切换到 PDO 后网页内容不显示

java - PreparedStatement 抛出 NullPointerException

c++ - C++的子集和递归

android - android原生相机支持哪些平台?

C++ 删除 wchar_t* 指向的内容

c# - 如何参数化 SQL 表而不会受到 SQL 注入(inject)的影响

php - PDO准备语句来存储html内容