0

我遇到了 MySQL++ 的问题,迫切需要帮助。我正在使用 Visual Studio 2010、MySQL++ v3.1.0 和 MySQL v5.1.59(x86 & x64);所有库都已正确编译。由于编译器设置“Both (/RTC1, equiv. to /RTCsu) (/RTC1)”处于打开状态,此错误仅发生在 Debug 版本中。

编辑:我应该注意,这只发生在调试版本中。在 Release 中,它就像一个魅力我已经将问题追溯到 mysqlpp_d.dll,由于引用计数,MySQL++ 对象在析构函数上崩溃。它抱怨无法访问 ref 计数器的内存,当它试图减少它时,它崩溃了。至少那是我认为发生的事情。

我尝试这样做以确保所有内容都以正确的顺序被取消引用和删除(即使它无关紧要,但我希望帮助我找到真正的问题): http: //pastebin.com/Ru0uYcy9

它崩溃了:

Launcher.exe 中 0x000007feeef5dd4c (mysqlpp_d.dll) 的第一次机会异常:0xC0000005:访问冲突写入位置 0x000007feeeff5148。Launcher.exe 中 0x000007feeef5dd4c (mysqlpp_d.dll) 处未处理的异常:0xC0000005:访问冲突写入位置 0x000007feeeff5148。

在这里休息:http: //pastebin.com/9Mfr7NwB

4

1 回答 1

0

这段代码有一个严重的错误:

mysqlpp::UseQueryResult res;
{
    mysqlpp::Query query = conn.query();
    query << "SELECT USER();";
    res = query.use();
    row = res.fetch_row();
}

您没有使用所有结果集。在 MySQL 中,返回数据的存储过程至少返回两个单独的结果集:第一个是您要求的结果,第二个是有关调用本身的状态信息。有关处理此问题的正确方法,请参阅examples/multiquery.cppMySQL++ 源代码分发。另请参阅MySQL++ 用户手册中的第 3.16 节。

这样做的主要后果是稍后对同一连接的查询将失败。

我认为您的内存损坏实际上是次要影响,主要问题源于忽略 MySQL C API 试图告诉您您正在尝试在同一连接上运行两个重叠查询,因为您没有消耗整个第一个结果集。从您发布的小代码中,我可以看到您忽略了返回的错误代码,因此,如果您还禁用了 MySQL++ 异常,您的代码将完全忽略此错误并愉快地继续踩踏它不应该的所有事情吨。

顺便说一句,请丢失查询中的尾随分号。C API 不需要它,并且可能会导致混淆,尤其是在面对多查询时。仅使用分号来分隔单个查询中的多个语句。

于 2011-09-20T04:51:19.400 回答