嵌入式MySQL支持Are Prepared语句
Are Prepared statements supported in embedded MySQL
我通常使用实时服务器进行开发,但我第一次想到我会迈出这一步,看看我是否可以将所有(C++)mysql代码作为嵌入式服务器运行。特别是,我非常喜欢事先准备好的陈述,因为它们(IMHO)"通常"优于未准备好的种类。
我尝试过从5.5.22开始使用libmysqld,从5.6.4开始使用libMySQL,但都不起作用。
连接完成后,简单的mysql_query/mysql_real_query命令可以正常工作,但当我准备的第一个语句发出mysql_stmt_fetch()时,我就会出现令人讨厌的"命令不同步"错误。
一个非常相似的问题出现在神谕论坛上(http://forums.mysql.com/read.php?168,507863507863#msg-507863)。
我看不到,也不相信我在mysql_real_connect()和mysql_stmt_fetch()之间缺少任何命令。
我所有的搜索都是空的,任何一个使用准备好的语句的嵌入式服务器的例子。我也没有找到一句真正的"你不能这样做"。
所以。。。是支持还是不支持?
感谢您的专业知识。
//编辑为了进一步解开这个谜(并在必要时指示),我的完整mysqlcmd序列如下:
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源发行版,而不是从集市上获得的。
关于:安装野牛:
- 确保将bison安装到没有空格的路径
- 不允许安装程序向开始菜单添加任何内容(导致"m4.exe NOTfind"错误)
- 手动将bison的bin文件夹添加到系统PATH
关于:signtool.exe
确保将signtool的路径添加到path中。示例
- c: \Program Files\Microsoft SDK \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);
在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移到二进制文件的运行时文件夹中,坐在那里想知道为什么更改没有起到任何作用。叹气
仅供参考:甲骨文技术人员的错误报告评论标记为[20 Feb 18:34]Sveta Smirnova完全没有意义。服务器ARg与任何事情都无关。
http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html
很抱歉我的英语不好,但问题是mysql_stmt_fetch打开了游标,但mysql_stmt_execute只执行mysql_stmt_store_result使用游标。。。
嵌入式MySQL是一个通常不使用的MySQL,对于这个问题,我在网上搜索了很多次,并准备了一个单独的项目。在这样做的过程中,我学到了很多东西,其中之一就是首先执行查询,然后存储结果。
为了摆脱不同类型的查询,请创建一个执行对象并返回结果,在这种情况下,您不必一次又一次地编写执行查询。
在本例中,用户也没有执行查询并尝试存储结果,只有当您尝试复制其他命令时才会发生这种情况。因此,问题的解决方案是执行mysql_stmt_execute
,然后调用mysql_stmt_store_result
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 嵌入式MySQL支持Are Prepared语句
- 使用prepared语句和sqlite事务语句