簡體   English   中英

在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 )即使使用“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM