みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

VB5+SQL2000での ** TRANSACTIONについて(ADO)

環境:VB5(SP3)+SQL2000(SP1)
VBで、BEGIN TRANSACTIONを定義し、その後更新用DBを更新する前に、ストアドプロシージャを利用せずDBを検索した場合、問題無く更新用DBへの更新に対して(ROLLBACK/COMMIT) TRANSACTION が効くのですが、ストアドプロシージャで検索した場合、(ROLLBACK) TRANSACTION が効きません。
分かりづらいですがサンプルを記します。

Function Test()
Dim MyRs As New ADODB.Recordset
Dim MyRs2 As New ADODB.Recordset
:
MyDB.Execute "BEGIN TRANSACTION TEST999",,adCmdText+adExecuteNoRecords
:
'(A)不具合未発生パターン
'レコードセットを開く
'このように、レコードセットを作成した場合問題なし。
MyRs.Open "SELECT * FROM TESTDB..テスト",MyDB,adOpenStatic

'(B)不具合発生パターン
'ただし、上のSELECT文をストアドプロシージャで開いた場合、ROLLBACKが効かない
'レコードセットを開く(正常に(ROLLBACK)TRANSACTIONが動作せず、UpDate時にCommitしている)
'MyRs.Open "TESTDB..TEST001",MyDB,adOpenStatic
:
MyRs2.Open "SELECT * FROM TESTDB..更新テスト",MyDB,adOpenKeyset,adLockPessimistic
If Err <> 0 Then
'Error処理
End If

If MyRs2.EOF Then
MyRs2.AddNew
MyRs2![FLD1] = MyRs2![FLD1A]
Else
MyRs2![FLD1] = "TEST"
End If

MyRs2.UpDate 'ここは正常終了。(Err = 0)

'テスト用にエラー設定
Err = 1
if Err <> 0 then
'(B)不具合発生パターンの場合、ROLLBACK をしても、DBに登録されてしまう。
MyDB.Execute "ROLLBACK TRANSACTION TEST999",,adCmdText+adExecuteNoRecords
Exit Function
End If
MyRs.Close
MyRs2.Close

SmileDB.Execute "COMMIT TRANSACTION TEST999",,adCmdText+adExecuteNoRecords
End Function

投稿日時 - 2002-09-02 17:59:27

QNo.349360

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

確か「.Execute」でSQL発行した場合、発行した時点でcommitされ
Rollbackできなかったような…

下の方法ではどうですか?

Mydb.BeginTrans
   ・
Mydb.Update
Mydb.CommitTrans
   ・
   ・
   ・
Mydb.RollbackTrans

投稿日時 - 2002-09-03 15:52:04

あなたにオススメの質問