

Visual C++ 2010 / ADO 接続で IBM DB2 に接続しています。  
行単位で追加/更新後にファイルの移動を行うようなプログラムを作成しています。

ファイル移動失敗時にロールバックを試みましたが、コミットされた状態になってしまいました。

接続時、もしくはDML文実行時にAutoCommitを解除する方法はありませんでしょうか？

実ソースがクラス化されているので、関わる部分を抜き出すと以下の様な感じです。

[code]

    CString szConnection = "Provider=IBMDADB2.DB2COPY1;Password=PASS;Persist Security Info=True;User ID=USER;Data Source=TESTDB;Location=xxx.xx.xxx.xx;Extended Properties="";Package Collection";
    
    _ConnectionPtr _connection;
    _connection.CreateInstance(__uuidof(Connection));
    _connection->Open((LPCTSTR) szParam, _T(""), _T(""), adConnectUnspecified);
    _connection->BeginTrans();
    
    CString szSql = "※ UPDATE or INSERT ";
    
    _connection->Execute((_bstr_t) szSql, &va, adOptionUnspecified);
    
    if (何らかの処理） {
        // 成功
        _connection->CommitTrans();
    } else {
        // 失敗時
        _connection->RollbackTrans();
    }
    
[/code]

2016-06-27 追記  
接続プロパティ（db2cli.ini や odbc設定ファイル）で  
AutoCommit=0 もしくは  
ODBC の SqlSetAttribute で SQL_AUTOCOMMIT_OFF  
あたりを渡せばいいみたいですが、Ado _ConnectionPtr 経由で渡す方法がわかりません

※上記の問題的には処理順序を変えてしのぎましたが、気になるトピックなので残させていただきます。


CC BY-SA 3.0
2016-06-25T13:45:30.227
27072
2016-06-27T06:14:47.287
2016-06-27T06:14:47.287
14001
14001
question
c++ visual-studio database mfc db2
DB2 の AutoCommit を VC++ ADO接続で解除する方法


[BeginTrans、CommitTrans、RollbackTrans メソッド](https://msdn.microsoft.com/ja-
jp/library/cc364105.aspx)によると

> すべてのプロバイダでトランザクションがサポートされているわけではありません。Connection オブジェクトの Properties
> コレクションに、"Transaction DDL"
> というプロバイダ定義のプロパティが表示されているかどうかを確認してください。このプロパティが表示されていれば、そのプロバイダはトランザクションをサポートしています。トランザクションをサポートしていないプロバイダの場合は、トランザクション
> メソッドを呼び出すと、エラーが発生します。

とのことです。`_connection->Properties`を確認してみてください。  
また

[code]

    _connection->BeginTrans();
    
[/code]

の戻り値はどうなっているでしょうか？ エラーが発生していたりしませんか？ ちなみに`1`が返ってくるべきです。というのも[IBM OLE DB
Provider
の制限](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.swg.im.dbclient.adonet.doc/doc/c0006803.html)によると

> IBMDADB2 では、ITransactionLocal インターフェースにより、
> 自動コミットおよびユーザー制御のトランザクション・スコープがサポートされています。 デフォルトのスコープは自動コミット・トランザクション・スコープです。
> ネストされたトランザクションはサポートされていません。

とあり`2`以上のネストされたトランザクションは動作しないものと思われます。


CC BY-SA 3.0
2016-06-27T02:05:50.573
27099
2016-06-27T02:05:50.573
4236
27072
answer