- - PR -
1つのトランザクションで同じストアドプロシージャを何度も呼ぶことはできますか?
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2006-09-12 22:17
1つのトランザクションの中でクライアント側から何度も同じストアドプロシージャを呼ぶことは可能でしょうか?
具体的に何がしたいかと言いますと あるテキストファイルに格納されている情報を1レコードずつ読み込み、その情報を元に、テーブルの特定レコードを更新したいと考えております。 更新する方法は、ストアドプロシージャを使っております。テキストファイルには複数のレコード分の情報がありますので、ストアドプロシージャを何度も呼び出し、複数のレコードを更新したいのですが、何らかのエラーが発生した場合には、すべての更新をやめたいと考えております。 この場合、トランザクションが使えるのかなと思い調べてみたのですが トランザクションを張ったまま、クライアント側に戻る方法が分かりませんでした。 環境は SQL Server 2005 Visual Basic 6.0 (ADOオブジェクトを利用しております) 私のイメージを簡単に説明しますと VB側で 1)トランザクションを始めるストアドプロシージャを呼ぶ 2)特定レコードを更新するストアドプロシージャを呼ぶ(必要なだけ繰り返す) 3)何か問題があったらRollback 4)全部成功したらcommit というようなことを行いたいのですがこれは可能でしょうか? |
|
投稿日時: 2006-09-12 22:28
試めしゃいいだろ。なんで何もせず質問なんてしてくるかねぇ。
努力を放棄しているようにしか見えないんだけど。 |
|
投稿日時: 2006-09-12 23:39
出来るのか どうかとという質問ならできます
>トランザクションを張ったまま、クライアント側に戻る方法が分かりませんでした。 トランザクションを張ったまま戻る必要ないのでは? Rollbackなりcommit すればトランザクション完了です |
|
投稿日時: 2006-09-12 23:46
ちなみにストアドプロシージャ内のトランザクションをCommitしていても
VB側でトランザクション切っていれば一括でRollbackできたりもします。(トランザクションのネスト) |
|
投稿日時: 2006-09-13 00:16
沢山のご回答ありがとうございます
この質問を上げる前に、 ストアドプロシージャに、トランザクション名を渡して BEGIN TRANSACTION @TranName だけをするプロシージャを作成し、 別のプロシージャでCommit TRANSACTION @TranName だけを行うプロシージャを作成し、実行してみたのですが Commit あるいは Rollbackを行わないでプロシージャが終了しています というエラーメッセージが出ておりましたので そういうことはしていけないと思いこんでおりました また、このことを質問の時に記載するべきでした 申し訳ありませんでした また、VB側でもトランザクションを使えば、 その後、ストアドプロシージャを呼んでも無効にできるんですね 非常に参考になりました ありがとうございます 明日、そちらの方法を試してみます |
|
投稿日時: 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
