[pgsql-jp: 35571] libpqxx ライブラリを使用したトランザクション制御について

堀越 horihorikoshi @ yahoo.co.jp
2005年 6月 24日 (金) 14:39:34 JST


いつもお世話になります。
堀越と申します。

下記のようなループ中で複数のSQLを実行するようなC++のプロ
グラムにおいて、途中でsql_error例外が発生してしまうと、
それまでのSQLの実行がすべてabortされてしまいます。

例外を発生したSQLを実行してもトランザクションがabortされ
ずに、正常に通ったSQLの実行結果はテーブルに反映させるよ
うにするにはどのようにすれば良いのでしょうか?ループ内にwork
インスタンスの生成、破棄のロジックを入れて、ループのたび
にworkインスタンスを生成しなければならないのでしょうか?

いつも質問ばかりで申し訳ありませんが、宜しくお願いいたし
ます。

以下、プログラムソースです。
-----
void ExecSQL(&W,生成したSQL文字列){
  try{
    W.exec(生成したSQL文字列);
  }catch(sql_error &e){
    cerr << "SQL error: " << e.what() << endl
         << "Query was: '" << e.query() << "'" << endl;
  }
}

int main()
{
  try
  {
    ifstream fin(filename);
    if(!fin){
      cout << "入力ファイルを開けません。" << endl;
      return 1;
    }

    // DBに接続する
    connection C(接続文字列);
    work W(C);

    // EOFまでファイルを読み込んでSQL実行
    while(省略){
        ※ここでSQLを生成
        ExecSQL(W,生成したSQL文字列);
    }

    // コミット処理を実行し、ファイルクローズする
    W.commit();
    fin.close();
  }
  catch (const exception &e)
  {
    cerr << "Exception: " << e.what() << endl;
    return 2;
  }
  catch (...)
  {
    // 上記に該当しない予期せぬエラー
    cerr << "Unhandled exception" << endl;
    return 100;
  }

  return 0;
}


__________________________________
Save the earth
http://pr.mail.yahoo.co.jp/ondanka/




pgsql-jp メーリングリストの案内