none
分散トランザクションが開始できない件について RRS feed

  • 質問

  • お世話になっております。

    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;

    お手数おかけ致します。

    よろしくお願いします。

    2018年8月14日 1:58