[英]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
)即使使用“ blanket”語法( catch (...)
)也無法捕獲MySQL回調錯誤。 由於此語法應捕獲所有異常,但在這種情況下不能捕獲所有異常,因此我不知所措,無法了解這里發生的情況。 如何捕獲SQL異常?
mysql C庫不會拋出任何異常。 就像大多數其他C庫一樣,它只是在公共位置(例如errno)設置錯誤信息並返回狀態。 由您的客戶端代碼檢查返回並引發錯誤/異常。
如果您需要解決問題的簡單方法,請嘗試mysql ++(AKA mysqlpp)。 這是我可以擔保的軟件; 堅如磐石! http://tangentsoft.net/mysql++/
嘗試在mysql C庫周圍使用一些c ++包裝器。 例如http://mysqlcppapi.sourceforge.net/
C不會拋出必須通過mysql_errorno函數檢查的異常。
我不建議使用Mysql C ++庫,原因有二:1.很難獲得支持。 2.相比Mysql C庫慢
您可以使用mysql_error()和mysql_errno()API來了解錯誤並通過異常手動進行
根據金斯敦的建議,我在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 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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.