現在、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?
はい、私はセッション - を呼び出すことができます>(開始)、それはまた、「無効なアクセスを:セッションが自動コミット・モードをである。」スローされます。同じように。 - canTransact()の結果は1です。これを使用してセッション - > begin()をガードしました。 – Chris
申し訳ありませんが、あなたの質問からそれを取得していません。あなたはPoco Transactionクラスを使って試したこともありますか? – erg
あなたは正しいです、私はまた、Pocoトランザクションクラスを作成しようとしました。私は現在、自分自身でODBC SessionImplオブジェクトを直接作成しようとしており、そのように回避しようとしています。 – Chris