1

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) は、「ブランケット」構文 ( ) でも MySQL コールバック エラーをキャッチしませんcatch (...)。この構文はすべての例外をキャッチするはずですが、この場合はそうではないため、ここで何が起こっているのか理解できません。SQL 例外をキャッチするにはどうすればよいですか?

4

4 に答える 4

5

mysql C ライブラリは例外をスローしません。他のほとんどの C ライブラリと同様に、一般的な場所 ( errno など) にエラー情報を設定し、ステータスを返すだけです。戻り値をチェックしてエラー/例外をスローするのは、クライアント コード次第です。

問題を簡単に修正する必要がある場合は、mysql++ (別名 mysqlpp) を試してください。これは私が保証できるソフトウェアです。岩のように固い! http://tangentsoft.net/mysql++/

于 2012-10-09T23:50:53.410 に答える
2

mysql C ライブラリに c++ ラッパーを使用してみてください。例http://mysqlcppapi.sourceforge.net/

C は、mysql_errorno 関数を介してチェックする必要がある例外をスローしません。

于 2012-10-09T03:52:19.203 に答える
1

2つの理由でMysqlC++ライブラリを提案しません1.サポートを受けるのが難しい。2.MysqlCライブラリと比較して遅い

mysql_error()およびmysql_errno()APIを使用して、エラーを認識し、例外を介して手動で行うことができます

于 2012-10-10T07:28:39.057 に答える
1

キングストニアンの提案に従って、私はmysqlの周りにmysql ++ラッパーを使用しました(ubuntuでのインストールについては、別のSOの質問に答える私のレシピを参照してください)

以下のコードは、重複する値がキーに挿入されたエラー処理をテストするために使用されました(Id_Target = 9)。DB構造に適切な挿入を使用して、独自のニーズに適応します。

#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;
}
}
于 2012-10-11T16:44:10.963 に答える