お世話になっております。
C++のアプリケーションより、リンクサーバーで更新を行うと、
「分散トランザクションを開始できなかった」エラーが発生します。
環境は以下となります。
アプリケーション作成
Visual C++ 2017
アプリケーション実行環境
Windows7
Windows Server 2016
SQL Server 2017
Windows Server 2016
Oracle 12c
上記のDBサーバーをリンクサーバーで接続しています。
アプリケーション起動時、Select文で、OracleのデータをSQL Serverを介してアプリケーションに取得しております。
取得したデータを更新する時、OPENQUERYを使用して、SQL Server ⇒ Oracleへ更新させたいのですが、以下エラーが発生し、反映できません。
リンク サーバー "TEST" の OLE DB プロバイダー "OraOLEDB.Oracle" から、メッセージ "トランザクションに登録できません。" が返されました。
リンク サーバー "TEST" の OLE DB プロバイダー "OraOLEDB.Oracle" で分散トランザクションを開始できなかったので、この操作を実行できませんでした。
ログで出力したOPENQUERYのUPDATE文をSQL Serverの新しいクエリから実行するのは成功します。
アプリケーション側の設定に不備があるのでしょうか?
以下、C++のコードです。
_stprintf(szSQLShain, _T("UPDATE OPENQUERY(TEST, 'select TEST_COIN, TEST_COIN2, TEST_COIN3, EVENT_SAISEI_FLG, EVENT_SAISEI_PC, EVENT_SAISEI_DATE from %s where SHAIN_CD=''%s''')""\r\n"
"SET TEST_COIN=%d,TEST_COIN2=%d,TEST_COIN3=%d,EVENT_SAISEI_FLG=%d,EVENT_SAISEI_PC='%s',EVENT_SAISEI_DATE=GetDate();"),
m_stInfo.szUpdateTable, m_stInfo.szShainCd, m_stInfo.nGoldTotalCoin, m_stInfo.nSilverTotalCoin, m_stInfo.nBronzeTotalCoin, nFlag, m_stInfo.szPCName);
// DB接続
::CoInitialize(NULL);
_ConnectionPtr pConnection = NULL;
_CommandPtr pCommand = NULL;
PutLog(_T("BB"), szSQLShain);
try{
//接続をオープン
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open(m_stInfo.szDBConnDsn, m_stInfo.szDBConnUser, m_stInfo.szDBConnPass, adConnectUnspecified);
_bstr_t bstrQuery("");
_variant_t vRecsAffected(0L);
pConnection->BeginTrans();
pConnection->Execute(_T("SET XACT_ABORT ON"),&vRecsAffected,adOptionUnspecified);
//pConnection->Execute(szSQLShain,&vRecsAffected,adOptionUnspecified);
pConnection->Execute(szSQLShain, NULL, adOptionUnspecified);
pConnection->CommitTrans();
//接続をクローズし、解放
pConnection->Close();
pConnection = NULL;
::CoUninitialize();
return TRUE;
お手数おかけ致します。
よろしくお願いします。