嵌入式MySQL中是否支持Prepared语句

Sas*_*wot 17 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 ); 
Run Code Online (Sandbox Code Playgroud)

此时,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();
Run Code Online (Sandbox Code Playgroud)

Sas*_*wot 3

我很害怕这个..但是经过不小的工作,我得到了我的问题的答案,以及问题的解决方案。(是的,我是一个懒惰的编码员......我希望其他人会告诉我这一切都是必要的......呵呵)

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

问题:嵌入式支持 stmts 吗?答案...他们应该是,但事实并非如此。

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

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

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

参考这个更容易阅读的《如何构建》: http://www.chriscalender.com/ ?p=689

我在此过程中确定的其他操作说明

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

我只安装了cmake和bison。为此不需要 Perl 和 bazaar。我得到了标准的 5.5.22 源发行版,而不是从集市获取。

回复:安装野牛:

  • 确保将 bison 安装到没有空格的路径
  • 不允许安装程序向开始菜单添加任何内容(导致“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 ):通用 Linux(架构独立)、压缩 TAR 存档 (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);
Run Code Online (Sandbox Code Playgroud)

在 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;
}
Run Code Online (Sandbox Code Playgroud)

并自己构建 libmysqld.dll、libmysqld.lib、libmysqld.pdb 的新发行版本

问题已解决。

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

仅供参考:甲骨文技术人员的错误报告评论标记为 [20 Feb 18:34] Sveta Smirnova 完全是无稽之谈。serverARgs 与任何事情都无关。