【问题标题】:Using MySQL++ throws EXC_BAD_ACCESS使用 MySQL++ 抛出 EXC_BAD_ACCESS
【发布时间】:2013-09-03 14:59:40
【问题描述】:

我正在尝试使用以下代码连接到 MySQL 数据库。但它一到达“Query query = conn.query()”行就会抛出 EXC_BAD_ACCESS。可能是什么原因?提前致谢!

#include <iostream>
#include <mysql++/mysql++.h>

using namespace mysqlpp;

int main(int argc, const char * argv[])
{

    try {
        Connection conn(false);
        if (conn.connect("db", "localhost", "root", "root")) {
            Query query = conn.query("select * from django_site");
        }
    }
    catch (BadQuery er) {
        std::cerr << "Error: " << er.what();
        return -1;
    } catch (const BadConversion& er) {
        // Handle bad conversions
        std::cerr << "Conversion error: " << er.what() << std::endl <<
        "\tretrieved data size: " << er.retrieved <<
        ", actual size: " << er.actual_size << std::endl;
        return -1;
    } catch (const Exception& er) {
        // Catch-all for any other MySQL++ exceptions
        std::cerr << "Error: " << er.what() << std::endl;
        return -1;
    }

    return 0;
}

打印conn对象返回

(mysqlpp::Connection) conn = {
  mysqlpp::OptionalExceptions = {
    exceptions_ = false
  }
  error_message_ = "\xe5$}\xff\x7f"
  driver_ = 0x00007fff5fc005a8
  co

更麻烦的是“conn_”变量指向NULL

(mysqlpp::Query) query = {
  std::__1::ostream = {
    std::__1::basic_ios<char, std::__1::char_traits<char> > = {
      std::__1::ios_base = {
        __fmtflags_ = 0
        __precision_ = 0
        __width_ = 0
        __rdstate_ = 0
        __exceptions_ = 0
        __rdbuf_ = 0x0000000000000000
        __loc_ = 0x0000000000000000
        __fn_ = 0x0000000000000000
        __index_ = 0x0000000000000000
        __event_size_ = 0
        __event_cap_ = 0
        __iarray_ = 0x0000000000000000
        __iarray_size_ = 0
        __iarray_cap_ = 0
        __parray_ = 0x0000000000000000
        __parray_size_ = 0
        __parray_cap_ = 0
      }
      __tie_ = 0x0000000000000000
      __fill_ = 0
    }
  }
  mysqlpp::OptionalExceptions = {
    exceptions_ = false
  }
  template_defaults = {
    std::__1::vector<mysqlpp::SQLTypeAdapter, std::__1::allocator<mysqlpp::SQLTypeAdapter> > = size=0 {}
    parent_ = 0x0000000000000000
    processing_ = false
  }
  conn_ = 0x0000000000000000
  copacetic_ = false
  parse_elems_ = size=0 {}
  parsed_names_ = size=0 {}
  parsed_nums_ = size=0 {}
  sbuffer_ = {
    std::__1::basic_streambuf<char, std::__1::char_traits<char> > = {
      __loc_ = {
        __locale_ = 0x0000000000000000
      }
      __binp_ = 0x0000000000000000
      __ninp_ = 0x0000000000000000
      __einp_ = 0x0000000000000000
      __bout_ = 0x0000000000000000
      __nout_ = 0x0000000000000000
      __eout_ = 0x0000000000000000
    }
    __str_ = ""
    __hm_ = 0x0000000000000000
    __mode_ = 0
  }
}

【问题讨论】:

  • 以前从未见过这个库,但我猜这是因为你调用 .query() 时没有参数......例如发送空查询。

标签: c++ mysql mysql++


【解决方案1】:

在创建查询之前,您没有检查对 connect() 的调用的返回类型。调用

Query query = conn.query();

如果 connect() 失败可能是导致此异常的原因。

根据手册页http://tangentsoft.net/mysql++/doc/html/refman/classmysqlpp_1_1Query.html 将NULL char* 传递给Connection::query() 函数是有效的,因为这是默认参数,所以我假设您的数据库连接请求失败。我会检查

的返回类型
conn.connect("db", "localhost", "root", "root");

并仔细检查您传递给此函数的数据库名称、用户名和密码字符串。

另外,请检查您的应用程序是否具有以root 身份连接到数据库所需的权限。

【讨论】:

  • 谢谢。我将 conn 部分更改为 ___if (conn.connect("db", "localhost", "root", "root")) { Query query = conn.query("select * from django_site"); }____;它仍然无法正常工作...但是“mysql --host =localhost --user=root --password=root db”在命令行提示符下连接得很好。
  • @haginile 那么调用connect的代码版本会失败吗?如果是这样,您的可执行文件是否有足够的权限尝试以 root 用户身份连接?
  • 对不起,我是一个完整的新手。我尝试创建一个新用户并授予所有权限(CREATE USER 'xcode'@'localhost' IDENTIFIED BY 'xcode'; GRANT ALL PRIVILEGES ON db. * TO 'xcode'@'localhost' WITH GRANT OPTION;),但它仍然失败。还有什么我需要做的吗?再次感谢!
  • 您是否尝试过以超级用户/管理员身份运行您的应用程序?
  • 嗨@mathematician1975。我不认为这是连接问题。发出 conn.connect 后,conn.connected() 现在返回 true,但 conn.query() 仍然抛出相同的错误...
【解决方案2】:

我应该早点回帖。对于遇到同样问题的其他人来说,错误的原因对我来说很愚蠢。原来我使用的是 C++11 的 std 库,但 MySQL++ 最初并不是针对它编译的。使用较新的 std lib 重新编译 MySQL++ 可以解决此问题。

【讨论】:

    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多