在 c++ 中捕获 MySQL 错误
Catch MySQL error in c++
在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语句一起使用的特定异常代码的引用。
显然,C++(使用此库mysql.h
)即使使用"一揽子"语法(catch (...)
)也不会捕获MySQL回调错误。 由于此语法应该捕获所有异常,但在这种情况下没有,因此我不明白这里发生了什么。 如何捕获 SQL 异常?
mysql C 库不会抛出任何 excption;它只是像大多数其他 C 库一样,在公共位置(如 errno )设置错误信息并返回状态。由客户端代码来检查返回并抛出错误/异常。
如果您需要一个简单的问题解决方法,请尝试mysql++(AKA mysqlpp)。这是一个我可以担保的软件;坚如磐石!http://tangentsoft.net/mysql++/
尝试在mysql C库周围使用一些C ++包装器。 例如 http://mysqlcppapi.sourceforge.net/
C 不会抛出您必须通过 mysql_errorno 函数检查的异常。
我不建议Mysql C++库,原因有两个1.It 很难获得支持。2.与Mysql C库相比速度慢
您可以使用 mysql_error() 和 mysql_errno() API 来了解错误并手动通过异常
Kingstonian的建议,我在MySQL周围使用了MySQL ++包装器(对于在Ubuntu中的安装,请参阅我回答另一个SO问题的食谱)
下面的代码用于测试错误处理,其中在键中插入了重复值 (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 conexaon");
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;
}
}
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- MySQL C++连接器链接错误
- 配置:错误:找不到 MySQL 包含目录
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- Visual Studio 2017 中的 MySQL 连接器/C++ 错误"Unresolved external symbol _get_driver_instance"
- 插入MySQL DB中的表之后,错误消息
- 连接到MySQL时如何修复xdev C++ api中的'string too long'错误
- MySQL 丢失连接错误
- C++ mysql 仅在构建解决方案时LNK2019错误
- 循环中的MySQL连接器/C 错误
- 使用MariadB在Windows上构建MySQL / QMYSQL插件的错误
- MySQL C++连接器程序抛出错误 15
- MySQL 连接器错误,将代码从 Java 转换为 C++
- Mysql 查询错误
- MYSQL连接太多错误不会消失
- C ++"在使用MySQL C API生成的共享库时未在此范围错误中声明
- 在 c++ 中捕获 MySQL 错误
- libmysql.dll中存在C++MySQL错误
- 如何解决 c++ 中mysql_init过程中"insufficient memory"的 mysql 错误?
- 从c++连接MySQL:错误LNK2001:未解析的外部符号