2017-01-16 16 views
1

現在、C++アプリケーションでトランザクションを使用しようとしていますが、ODBCの自動コミットモードに問題があります。C++ Poco ODBCトランザクション - AutoCommitモード

私はPOCOライブラリを使用して、同じマシン上のPostgreSQLデータベースへの接続を作成しています。現在、私はこのデータベースに単一のステートメントとしてデータを送信できますが、このデータをより迅速に送信できるようにPocoのトランザクションライブラリを使用する方法については頭を下げることはできません。

私は挿入する数千のレコードを持っているので、単一の挿入文を使用し続けるのは極端に遅くて実用的ではありません - ですから、私はPocoのトランザクションを使って少し高速化しています。

私が遭遇していますエラーが理論的には簡単なものである - ポコは、次のエラーを投げている:

'Invalid access: Session is in auto commit mode.' 

私は理解して、その結果として、私は何とかfalseに「自動コミット」に設定しなければなりません - ただ1つのトランザクションとしてではなく、1行ずつデータベースにデータをコミットすることができます。

問題はどのように設定するかです。

現在、私はこのようにたくさん見えますSession.hから作成されたセッションを、持っている:

接続データは、ログイン情報、パスワード、データベース、サーバーおよび「ドライバとシンプルにstringstreamある
session = new Poco::Data::Session(
       "ODBC", 
       connection_data.str() 
      ); 

= {PostgreSQL ANSI}; " PostgreSQLのドライバを利用するようにODBCに指示します。

私は、セッションのsetFeatureまたはsetProperty設定を通じて、プロパティ "autocommit"をfalseに設定しようとしましたが、これは無駄です。 (それはこの時点でより多くの溝の試みだった)。周りを見る

session->setFeature("AUTOCOMMIT", false); 

、私は、ODBC /セッション/ SessionImpl.hから直接ODBC sessionImplを作成する代わりに、上記のこの一般的な方法を使用して、ここから新しいセッションオブジェクトを作成することによって、可能な代替方法を見ました。

これの利点は、ODBCのsessionImplはこれを処理できるようになることをお勧めヘッダにモードを自動コミットへの参照、持っているということである。しかし

void autoCommit(const std::string&, bool val); 
    /// Sets autocommit property for the session. 

は、前sessionImplを使用していないた、私はgarunteeすることはできませんこれがうまくいくかどうか、またはこれが利用可能な限られたドキュメントで動作することができるかどうか。私は、Visual Studioで(必要な)2015 ポコ1.7.5 ブースト

Would any one know the correct way of setting this feature (above) or a alternative method to achieving this?

答えて

4

をC++ 03(未11)を、使用しています

編集:

:で、POCOのソースを見てみます

https://github.com/pocoproject/poco/blob/develop/Data/ODBC/src/SessionImpl.cpp#L153

プロパティはautoCommit名付けられるようだ、と

を見て

プロパティ名の場合が重要です。したがって、session->setFeature("autoCommit", false);を使用すると役立ちますか?


カントあなただけの対応Sessionオブジェクトにsession->begin();session->end();を呼びますか?

返されるもの:session->canTransact()

文書によれば、begin()は新しいトランザクションを開始します。文書には前後に設定する必要のあるプロパティは記載されていません。

参照:https://pocoproject.org/docs/Poco.Data.Session.html

+0

はい、私はセッション - を呼び出すことができます>(開始)、それはまた、「無効なアクセスを:セッションが自動コミット・モードをである。」スローされます。同じように。 - canTransact()の結果は1です。これを使用してセッション - > begin()をガードしました。 – Chris

+0

申し訳ありませんが、あなたの質問からそれを取得していません。あなたはPoco Transactionクラスを使って試したこともありますか? – erg

+0

あなたは正しいです、私はまた、Pocoトランザクションクラスを作成しようとしました。私は現在、自分自身でODBC SessionImplオブジェクトを直接作成しようとしており、そのように回避しようとしています。 – Chris

関連する問題