MySQL Query执行但抛出异常

时间:2011-08-01 19:30:34

标签: c++ mysql

我的代码:

try {
    sql::Driver *driver;
    sql::Connection *con;
    sql::Statement *stmt;

    /* Create a connection */
    driver = get_driver_instance();
    con = driver->connect("tcp://127.0.0.1:3306", "root", "123456");

    stmt = con->createStatement();
    stmt->executeQuery("CREATE USER 'user22'");

    delete stmt;
    delete con;

} catch (sql::SQLException &e) {
    cout << "# ERR: " << e.what();
    cout << " (MySQL error code: " << e.getErrorCode();
    cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}

创建user22但是也抛出一个(空?)异常:

# ERR:  (MySQL error code: 0, SQLState: 00000 )

当然,重新执行它会导致正常的异常:

# ERR: Operation CREATE USER failed for 'user22'@'%' (MySQL error code: 1396, SQLState: HY000 )

评论executeQuery行会导致无异常(空白输出) 这是常见的吗?我应该忽略这个吗?

3 个答案:

答案 0 :(得分:18)

您正在使用 executeQuery ,它应该返回 sql :: ResultSet对象,并且您正在查询“CREATE USER”,它返回true或者是假的。

对于这种情况,有一个执行方法。所以......

stmt = con->createStatement();
stmt->execute("CREATE USER 'user22'");

不会抛出错误。

是的,我知道帖子已经有2年了,但是如果有人在将来遇到同样的问题可能会对他们有用。

答案 1 :(得分:0)

来自MySQL参考 - 13.6.7.2 DECLARE ... HANDLER Syntax

  

SQLSTATE值(5个字符的字符串文字)或MySQL错误代码(数字)。您不应该使用SQLSTATE值'00000'或MySQL错误代码0,因为它们表示成功而不是错误条件。有关SQLSTATE值和MySQL错误代码的列表,请参见第C.3节“服务器错误代码和消息”。

答案 2 :(得分:0)

我最近遇到的情况是查询导致异常,错误代码为0,sql状态为1000.这可能不是你遇到的问题,但是如果有人在试图找出某些东西时偶然发现这个问题类似于这里为我解决了什么:

我一直收到此错误的全部原因是由Java连接器(客户端慢查询日志和性能指标日志)编写的日志文件是由错误的用户创建的,因此我的进程不是允许覆盖它们。 公平地说,这会在启动期间发出警告,但每次连接器尝试写入日志时我都没有预料到异常。

因此,这将是一个示例,其中错误代码为0的异常实际上可以被视为可以忽略的警告(例如Jesse的答案引自MySQL参考)。

顺便说一句:状态代码0表示成功完成(就像MySql错误代码0),状态代码1000表示&#34;警告&#34; (https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm)。