プロが教える店舗&オフィスのセキュリティ対策術

現在サーババージョンアップに伴うストアドの動作検証を行っています。

内容としては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」はなくてもいいと思うのですが、

明確に『不要である』としている文献等、見つからなかったため、迷っています。


サーバはバージョンアップに伴い、分散トランザクションを使用するようになっていますが、

この変更が影響しているのかどうか、まったく別の原因なのか、わからない状態です。


うまく伝わっているか心配ですが、どうぞ宜しくお願い致します。

A 回答 (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を
 書いても大丈夫だったと思いますが、ダメならストアド側でトランザクション制御はしないとか。)

## 的外れだったらごめんなさいね。
    • good
    • 0
この回答へのお礼

返信が遅れてすみませんでした。

処理をご回答いただいた「Begin Transaction ~ Commit」に変更し、

無事に解決できました。

ありがとうございました。

お礼日時:2014/07/08 11:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A