- PR -

1つのトランザクションで同じストアドプロシージャを何度も呼ぶことはできますか?

1
投稿者投稿内容
ぐぴお
会議室デビュー日: 2006/09/12
投稿数: 3
投稿日時: 2006-09-12 22:17
1つのトランザクションの中でクライアント側から何度も同じストアドプロシージャを呼ぶことは可能でしょうか?

具体的に何がしたいかと言いますと

あるテキストファイルに格納されている情報を1レコードずつ読み込み、その情報を元に、テーブルの特定レコードを更新したいと考えております。
更新する方法は、ストアドプロシージャを使っております。テキストファイルには複数のレコード分の情報がありますので、ストアドプロシージャを何度も呼び出し、複数のレコードを更新したいのですが、何らかのエラーが発生した場合には、すべての更新をやめたいと考えております。

この場合、トランザクションが使えるのかなと思い調べてみたのですが
トランザクションを張ったまま、クライアント側に戻る方法が分かりませんでした。

環境は
SQL Server 2005
Visual Basic 6.0 (ADOオブジェクトを利用しております)

私のイメージを簡単に説明しますと

VB側で

1)トランザクションを始めるストアドプロシージャを呼ぶ
2)特定レコードを更新するストアドプロシージャを呼ぶ(必要なだけ繰り返す)
3)何か問題があったらRollback
4)全部成功したらcommit

というようなことを行いたいのですがこれは可能でしょうか?
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-09-12 22:28
試めしゃいいだろ。なんで何もせず質問なんてしてくるかねぇ。
努力を放棄しているようにしか見えないんだけど。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-09-12 23:39
出来るのか どうかとという質問ならできます

>トランザクションを張ったまま、クライアント側に戻る方法が分かりませんでした。
トランザクションを張ったまま戻る必要ないのでは?
Rollbackなりcommit すればトランザクション完了です


ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-09-12 23:46
ちなみにストアドプロシージャ内のトランザクションをCommitしていても
VB側でトランザクション切っていれば一括でRollbackできたりもします。(トランザクションのネスト)
ぐぴお
会議室デビュー日: 2006/09/12
投稿数: 3
投稿日時: 2006-09-13 00:16
沢山のご回答ありがとうございます

この質問を上げる前に、

ストアドプロシージャに、トランザクション名を渡して
BEGIN TRANSACTION @TranName

だけをするプロシージャを作成し、

別のプロシージャでCommit TRANSACTION @TranName
だけを行うプロシージャを作成し、実行してみたのですが
Commit あるいは Rollbackを行わないでプロシージャが終了しています
というエラーメッセージが出ておりましたので
そういうことはしていけないと思いこんでおりました

また、このことを質問の時に記載するべきでした
申し訳ありませんでした

また、VB側でもトランザクションを使えば、
その後、ストアドプロシージャを呼んでも無効にできるんですね
非常に参考になりました
ありがとうございます 明日、そちらの方法を試してみます
ぐぴお
会議室デビュー日: 2006/09/12
投稿数: 3
投稿日時: 2006-09-13 22:05
VB側でトランザクションをはる方法を試してみましたので途中経過をご報告いたします。

私が現在試している方法ではエラーとなります。

「エラー番号 -2147467259
このカーソルの種類を使用している場合は、トランザクションに複数のRecordsetを含めることはできません。カーソルの種類を変更するか、トランザクションをコミットする、またはRecordsetのいずれかを閉じて下さい」

とエラーメッセージが表示されております。現在色々試しているのですがこのエラーを
無くすできない状況です。引き続き調査中です。

参考までにcn.CursorLocation をadUserServerでやってみてもダメでした
現在は、コネクションオブジェクトのBeginTransを使うのではなく
直接SQLをVB側で発行する方法を試しております

この件につきまして、何かご存じ方いらっしゃいましたら
アドバイス頂けないでしょうか

---(ソースの抜粋)---------------------------------------------------------------
Option Explicit
Private cn As ADODB.Connection
Private cmd As ADODB.Command

Private param1 As ADODB.Parameter
Private param2 As ADODB.Parameter
Private param3 As ADODB.Parameter
Private param4 As ADODB.Parameter

Private Sub Form_Load()

'コネクションオブジェクトの生成
Set cn = New ADODB.Connection
cn.ConnectionString = "DSN=XXXXUser ID=XXXX;Password=XXXX"
cn.CursorLocation = adUseClient

'コネクションの確立
cn.Open

'コマンドオブジェクトの生成
Set cmd = New ADODB.Command
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = cn
cmd.CommandText = "hogehogehoge"

'パラメタの生成
Set param1 = cmd.CreateParameter("prm1", adChar, adParamInput, 4)
Set param2 = cmd.CreateParameter("prm2", adChar, adParamInput, 2)
Set param3 = cmd.CreateParameter("prm3", adChar, adParamInput, 4)
Set param4 = cmd.CreateParameter("prm4", adDBTimeStamp, adParamInput)

'コマンドオブジェクトにパラメタを追加
cmd.Parameters.Append param1
cmd.Parameters.Append param2
cmd.Parameters.Append param3
cmd.Parameters.Append param4

'関数を呼ぶ
Fucn_A

Unload Me
End Sub

Private Sub Func_A()

On Error GoTo ERR_FUNC

'トランザクションの開始
cn.BeginTrans

Do While ループの終了条件を設定

'ストアドプロシージャを呼ぶ
cmd.Parameters("prm1").Value = "1100"
cmd.Parameters("prm2").Value = "00"
cmd.Parameters("prm3").Value = "0001"
cmd.Parameters("prm4").Value = "2006-09-13 21:35:21"

cmd.Execute <--- ここでエラーが発生します
Loop

'トランザクションの終了
cn.CommitTrans

Exit Sub

ERR_FUNC:
Dim er As ADODB.Error
Dim strMsg As String

For Each er In cn.Errors
strMsg = strMsg & "エラー番号 " & er.Number & " ;" & vbCrLf & er.Description & vbCrLf
Next er
MsgBox strMsg, , "エラー"
End Sub

Private Sub Form_Unload(Cancel As Integer)

'コネクションのクローズ
cn.Close

'オブジェクトの開放
Set cmd = Nothing
Set cn = Nothing

End Sub

ちなみにストアドプロシージャ hogehogeは
param1、param2、param3で一致したレコードのある値をparam4で更新
(Update)します。

[ メッセージ編集済み 編集者: ぐぴお 編集日時 2006-09-13 22:26 ]
1

スキルアップ/キャリアアップ(JOB@IT)