2011-01-20 8 views
3

どのように私はC++でのトランザクションにクエリの量をラップに行きますか? MySQLデータベースと対話するC++でC++:MySQLの取引

#include "/usr/include/mysql/mysql.h"

:私は、このファイルを使用して、Ubuntuの10に取り組んでいます。

EDIT:今私はそうのように、小さなラッパークラスを介してクエリを実行している:

MYSQL_RES* PDB::query(string query) 
{ 
    int s = mysql_query(this->connection, query.c_str()); 

    if(s != 0) 
    { 
     cout << mysql_error(&this->mysql) << endl; 
    } 

    return mysql_store_result(this->connection); 
} 

MYSQL_ROW PDB::getarray(MYSQL_RES *res) 
{ 
    return mysql_fetch_row(res); 
} 

// example one 
MYSQL_RES res = db->query("SELECT * FROM `table` WHERE 1"); 
while(MYSQL_ROW row = db->getarray(res)) 
    { 
    cout << row[0] << endl; 
    } 

答えて

3

あなたはいつもちょうど手動で.../START TRANSACTION/COMMITを実行することができます。

コンストラクタでのSTART TRANSACTIONを実行するラッパークラスを作成することです別の方法は、コミット/ロールバック機能を提供し、あなたのユースケースに応じて、破壊時にロールバックを行います。

+0

SO私はちょうどのような一つの大きなクエリ文字列にすることができます:「トランザクションを開始し、UPDATE ...; UPDATE ...; UPDATE。 ..;コミット; "その後、通常のmysql_query()を実行しますか? – Josh

+1

必ずしもすべてを1つのステートメントに入れる必要はありません。 DB->クエリ( "TRANSACTIONをSTART"); - DB->クエリ( "UPDATE ..."); - DB->クエリ( "UPDATE ..."); - db-> query( "COMMIT"); ... –

4

あなたがMySQL++を使用する場合は、Transaction objectsRAIIトランザクション動作を取得:

mysqlpp::Connection con(/* login parameters here */); 
mysqlpp::Query query = con.query("UPDATE foo SET bar='qux' WHERE ..."); 
mysqlpp::Transaction trans(con); 
mysqlpp::StoreQueryResult res = query.execute(); 
// do more random things 
if (commit_path) { 
    trans.commit(); // commit DB changes 
} 
else { 
    // commit() not called, so changes roll back when 'trans' goes out of scope 
}