• 締切済み

レコードセットの開放のタイミングについて

いつもお世話になります。 クライアント:Excel2000(マクロ) サーバ   :SQLServer2000 Dim strCon As String Dim oWK As Object Dim oDB As Object Dim strQ As String Dim rRec As RecordSet strCon = "ODBC;DRIVER=SQL Server;SERVER=hoge;UID=hoge;PWD=hoge;DATABASE=hoge" Set oWK = DBEngine.CreateWorkspace("hogewk", "hoge", "hoge", dbUseODBC) Set oDB = oWK.OpenConnection("", dbDriverNoPrompt, False, strCon) strQ = "select * from [tbl_hoge]" Set rRec = db.OpenRecordset(strQ, _ dbOpenDynamic, _ dbExecDirect, _ dbOptimisicValue) Do Until rRec.EOF = True If (条件) then oWK.Begintran 処理 oWK.Commit End If rRec.MoveNext Loop 上記のプロシージャをExcelからSQLServerに対し実行しましたが、rRec.MoveNextが エラーとなってしまいました。 oWK.Commitを実行後、問題が発生いたしました。 おそらく、oWK.CommitによりrRecレコードセットが開放されてしまったと思います。 これは仕方が無いのでしょうか。回避方法(プロシージャレベル)は御座いますでしょうか。 情報に不足がある場合、ご連絡いただけましたら補足させていただきます。 どうか宜しくお願いいたします。

みんなの回答

noname#22222
noname#22222
回答No.1

スーツのデザイナでプログラマではありませんので参考程度に・・・。 質問者のコードを参考に SQL Server 2000にExcelからアクセスしてみました。 Private Sub CommandButton1_Click() On Error GoTo Err_CommandButton1_Click   Dim isError As Boolean   Dim oWK   As Object   Dim oDB   As Object   Dim rRec  As DAO.Recordset   Dim strCon As String   Dim strQ  As String   strCon = "ODBC;DRIVER=SQL Server;SERVER=LAVIE;UID=sa;PWD=login007;DATABASE=Sales2006SQL"   strQ = "select * from [table1]"   Set oWK = DBEngine.CreateWorkspace("LAVIEWK", "LAVIE", "LAVIE", dbUseODBC)   Set oDB = oWK.OpenConnection("", dbDriverNoPrompt, False, strCon)   Set rRec = oDB.OpenRecordset(strQ, _                 dbOpenDynamic, _                 dbExecDirect, _                 dbOptimisticValue)   With oWK     .BeginTrans     With rRec       If Not .BOF Then         .MoveFirst         Do Until .EOF           If .Fields(0) = 1 Then             .Edit             .Fields(1) = "Z"    ' ロールバックされる             .Update           ElseIf .Fields(0) = 3 Then             .Edit             .Fields(0) = 1     ' エラーが発生する             .Update           End If           .MoveNext         Loop       End If     End With     .CommitTrans   End With   rRec.Close   oDB.Close   oWK.Close Exit_CommandButton1_Click:   Exit Sub Err_CommandButton1_Click:   MsgBox "データの更新時にエラーが発生しました。"   Resume Exit_CommandButton1_Click End Sub *これでエラーを発生させるとトランザクションがロールバックされましたので多分OKかと。 *なお、ただ単に参照するだけであれば、全体に疑問があります。

関連するQ&A