• 締切済み

SQLServer 分散トランザクションについて

現在サーババージョンアップに伴うストアドの動作検証を行っています。 内容としては2000で動作していたものを2008R2に移行するだけです。 そこでひとつ問題が発生して作業がとまってしまいましたので、 お力を借りたく、質問させていただきます。 環境としては、クライアントはACCESSプログラム、DBはSQLServerとなっています。 ストアドの実行で下記のように記載していたプログラムが動作しなくなりました。 Set adoCN = New ADODB.Connection adoCN.Open CurrentProject.Connection adoCN.BeginTrans adoCN.Execute "exec dbo.実行ストアド" 'エラー判定 adoCN.CommitTrans 上記エラー判定で「リンク サーバー "(null)" の OLE DB プロバイダー "SQLNCLI10" から、 メッセージ "アクティブなトランザクションがありません。" が返されました。」 となってしまいます。 また、このストアド内では「SET XACT_ABORT ON ~ SET XACT_ABORT OFF」 としてあります。 ちなみに、上記「adoCN.BeginTrans」、「adoCN.CommitTrans」をコメントすると、 正常に動作しました。 「SET XACT_ABORT ON」としているので「adoCN.BeginTrans」はなくてもいいと思うのですが、 明確に『不要である』としている文献等、見つからなかったため、迷っています。 サーバはバージョンアップに伴い、分散トランザクションを使用するようになっていますが、 この変更が影響しているのかどうか、まったく別の原因なのか、わからない状態です。 うまく伝わっているか心配ですが、どうぞ宜しくお願い致します。

みんなの回答

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

>「SET XACT_ABORT ON」としているので「adoCN.BeginTrans」はなくてもいいと思うのですが Set adoCN = New ADODB.Connection adoCN.Open CurrentProject.Connection adoCN.BeginTrans adoCN.Execute "exec dbo.実行ストアド" insert into アクセスのテーブル values(1) 'エラー判定 adoCN.CommitTrans とかだと、 adoCN.BeginTransとadoCN.CommitTransはなくては困るはず。 (アクセスのテーブルへのinsertがストアドの結果に関係なく実行されるから。) ということで >明確に『不要である』としている文献等、見つからなかったため は見つからないと思います。 ストアドプロシジャ内のどの命令でエラーがでているのかが不明なので (⇒これを特定するのが先のように思いますが) はっきりしたことはわかりませんが、 >このストアド内では「SET XACT_ABORT ON ~ SET XACT_ABORT OFF」としてあります のほうが問題なのでは? ## SET XACT_ABORT ONなんて気持ち悪くて使う気にならないので使ったことはないので ## 良く分かりませんが クライアントのadoのトランザクションの中で、突然、sqlserverにトランザクション制御を 任せるような命令を出したらなにかおかしくなるようにしか思えないです。 SET XACT_ABORT ON ~ SET XACT_ABORT OFF を Begin Transaction ~ Commit にしてエラー制御をきちんと書いて、エラーならロールバックするようにしてみたら? と思います。 (SQL Serverはトランザクションの入れ子がOKだったはずなのでbegin transactionを  書いても大丈夫だったと思いますが、ダメならストアド側でトランザクション制御はしないとか。) ## 的外れだったらごめんなさいね。

ipsum11
質問者

お礼

返信が遅れてすみませんでした。 処理をご回答いただいた「Begin Transaction ~ Commit」に変更し、 無事に解決できました。 ありがとうございました。