
現在サーババージョンアップに伴うストアドの動作検証を行っています。
内容としては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件)
- 最新から表示
- 回答順に表示
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を
書いても大丈夫だったと思いますが、ダメならストアド側でトランザクション制御はしないとか。)
## 的外れだったらごめんなさいね。
返信が遅れてすみませんでした。
処理をご回答いただいた「Begin Transaction ~ Commit」に変更し、
無事に解決できました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
トリガが完全にかからない
-
ストアド更新履歴
-
SQLServerでOracleシーケンスの...
-
ストアド、トリガーの同時呼出
-
NETWORKDAYS関数について
-
「マスタ」と「テーブル」の違...
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
ACCESS2007 フォーム 「バリア...
-
オラクルではできるのにSQLSERV...
-
DataTableから条件を満たした行...
-
SELECT時の行ロックの必要性に...
-
主キーにインデックスは貼らな...
-
accessのロック
-
実行時エラー3086 削除クエリ...
-
Access VBA [リモートサーバー...
-
IFで条件を分岐させてのINSERT...
-
排他ロックしたレコードが、別...
-
ACCESSのODBCリンクテーブルに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
トリガが完全にかからない
-
ストアドでXMLファイルを読込む...
-
ストアドプロシージャの多用で...
-
SQL Server 2005 レプリケーシ...
-
ストアド更新履歴
-
ADOからのストアド実行でエラー...
-
SQL Serverトリガの中でDMLの種...
-
エクセルアドインの使用方法に...
-
mdbでトリガはできますか?
-
ストアド、トリガーの同時呼出
-
SQLServer7.0 重大な例外「EXCE...
-
ソリューションエクスプローラ...
-
SQLServerでOracleシーケンスの...
-
エクセルの関数で
-
SQL Server INSERTのトリガで採番
-
SQLServerのトリガ機能について...
-
SQL2000でのTRUNCATE TABLE
-
「マスタ」と「テーブル」の違...
-
3つ以上のテーブルをUNIONする...
おすすめ情報