在C ++中,我正在使用mysql.h
库,我无法捕获MySQL错误(例如,由于主键冲突而无法插入)。
我试过了
#include <mysql.h>
// ...
try{
res = mysql_perform_query(conn, sqlIn);
} catch (...) {
// ...
}
但它仍然不能避免中止:
MySQL query error : Duplicate entry
我正在使用PuTTy接口运行已编译的c ++程序,并且当程序中止时,它会重现MySQL的错误(无论我是否使用TRY CATCH)。
我没有找到任何关于MySQL使用catch语句的特定异常代码的引用。
显然,即使使用“一揽子”语法(mysql.h
),C ++(使用此库catch (...)
)也不会捕获MySQL回调错误。由于这种语法应该捕获所有异常,但在这种情况下不会,我无法理解这里发生的事情。如何捕获SQL异常?
答案 0 :(得分:5)
mysql C库不会抛出任何异常;它只是像大多数其他C库一样,在一个公共位置(如errno)设置错误信息并返回状态。它取决于您的客户端代码,以检查返回并抛出错误/异常。
如果您需要轻松解决问题,请尝试使用mysql ++(AKA mysqlpp)。 这是我可以保证的软件;坚如磐石! http://tangentsoft.net/mysql++/
答案 1 :(得分:2)
尝试在mysql C库周围使用一些c ++包装器。例如http://mysqlcppapi.sourceforge.net/
C不会抛出必须通过mysql_errorno函数检查的异常。
答案 2 :(得分:1)
我不建议使用Mysql C ++库有两个原因 1.很难获得支持。 2.Slow与Mysql C库相比
您可以使用mysql_error()和mysql_errno()API来了解错误并手动完成异常
答案 3 :(得分:1)
根据金斯敦的建议,我使用mysql的mysql ++包装器(在ubuntu中安装,see my recipe answering another SO question)
下面的代码用于测试错误处理,其中在键中插入了重复值(Id_Target = 9)。根据您自己的需要,使用适合您的数据库结构的插入。
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include </usr/include/mysql++/mysql++.h>
// sudo g++ -o /temp/zdelMySQLpp01c $(mysql_config --cflags) /home/ubuntu/zdelMySQLpp01c.cpp $(mysql_config --cflags --libs) -l pthread -std=c++0x -g -L/usr/lib/mysql -lmysqlclient -lmysqlpp
using namespace mysqlpp;
using namespace std;
//MySQL type
struct connection_details {
char *server;
char *user;
char *password;
char *database;
};
int main(int argv, char** argc){
// MySQL connection (global)
struct connection_details mysqlD;
mysqlD.server = (char *)"localhost"; // where the mysql database is
mysqlD.user = (char *)"root"; // the root user of mysql
mysqlD.password = (char *)"XXXXXX"; // the password of the root user in mysql
mysqlD.database = (char *)"test"; // the databse to pick
// connect to the mysql database
mysqlpp::Connection conn(false);
if (conn.connect(mysqlD.database, mysqlD.server, mysqlD.user, mysqlD.password)) {
//printf("ALOALO funcionou conexao\n");
mysqlpp::Query query = conn.query("INSERT INTO test.target (Id_Target, Ds_Target, Ds_Target_Name, Ds_Target_PWD, Ds_Target_Email, Ds_Target_Icon) VALUES ('9', 'test', 'name', 'pass', 'email', NULL)");
if (mysqlpp::StoreQueryResult res = query.store()) {
cout << "We have:" << endl;
for (size_t i = 0; i < res.num_rows(); ++i) {
cout << '\t' << res[i][0] << endl;
}
} else {
cerr << "Failed to get item list: " << query.error() << endl;
return 1;
}
return 0;
}
}