• 締切済み

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

いつもお世話になります。 クライアント: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

  • VB上でのレコードセットの扱いについて

    お世話になっています。 現在VB6+SQLSERVERで開発をしているんですが、SQLで取得したレコードセットオブジェクトの扱いについての質問です。 取得したレコードセットオブジェクトをループ文等で使う場合、一旦配列に代入して使うのと、そのままMoveNext文で使うのでは、速さでは違いはありますか?

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。

  • Excel VBA DAO について

    いつもお世話になっております。 現在Excel2007でマクロを組みました。 下記ソースのような形で、マクロを実行するブック内にあるシートから、データを取得するのですが・・・・ ~ソース例~ dim dbEngine as object Dim db as object Dim rs as object Dim sql as object '■SQL格納 sql = sql & "Select 社員名 " sql = sql & " ,Sum(月収) as 年収 " sql = sql & " From 月収一覧 " sql = sql & "Group By 社員名,月収; " '■DBを開く Set dbEngine = CreateObject("DAO.DBEngine36") Set db = dbEngine.OpenDatabase("C:\社員月収.xls", False, False, "Excel8.0;") '■SQL実行後レコードセットへ格納 Set rs = db.Openrecordset(sql) としていますが「■DBを開く」の部分でCreateObject内で宣言している”DAO.DBEngine36”の部分をそのPCのDAOライブラリのバージョンによって変更したいのですが、可能なのでしょうか?? 以上です><よろしくお願いいたします!!

  • Excel VBAでセルに書いた時刻を取得したいのに・・・

    ExcelのVBAで、OnTimeを使い、 定時に印刷させるプログラムを組んでいます。 今までOnTimeの時刻設定に直接時刻を入れ込んでいたのですが、 ワークシートに登録した時刻を使うようにしたいと思い、 次のようにしたのですが、 Setのところの変数名で「オブジェクトが必要です」エラーが出ます。 ・・・何が悪いのでしょうか? Dim routinetime1 As String Dim routinetime2 As String Dim routinetime3 As String Set routinetime1 = Range("A1").Value Set routinetime2 = Range("B2").Value Set routinetime3 = Range("C3").Value Application.OnTime TimeValue(routinetime1), "印刷プロシージャ" Application.OnTime TimeValue(routinetime2), "印刷プロシージャ" Application.OnTime TimeValue(routinetime3), "印刷プロシージャ" よろしくお願いいたします。

  • Access2007 サブフォームのレコードを一括印刷する方法

    お世話になっております。 サブフォームは帳票型になっており、下記で表示されている全レコードのチェックが入ります。 これと平行して、各レコードを印刷したいのですが、カーソルがあるレコードのみがレコードの数だけ印刷されてしまいます。 これを各レコードごとに印刷したいと思います。 Dim dbs As Database Dim rst As Recordset Dim strSQL As String Set dbs = CurrentDb Set rst = Me.RecordsetClone With rst If .RecordCount > 0 Then .MoveFirst Do Until .EOF .Edit !チェック = True DoCmd.OpenReport "印刷", acNormal, , "コード=" & Me.コード .Update .MoveNext Loop End If .Close End With ご教授いただければ幸いです。よろしくお願いいたします。

  • ODBCでの接続方法

    1050YEN様、ご回答ありがとうございました。 実は「CreateWorkSpace」はクリアしたのですが、次の「OpenConnection」でエラーになってしまいました。 Dim datodbc As New DAO.DBEngine Dim wrkodbc As DAO.Workspace Dim conPubs As DAO.Connection Dim qdfTemp As DAO.QueryDef wrkodbc = datodbc.CreateWorkspace("", "Admin", "", "dbuserODBC") conPubs = wrkodbc.OpenConnection("", , , "ODBC;DSN=towaDS;") どなたか、ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • Access レコードセットを動的配列に

    初めて質問させていただきます。Access勉強中です。 Access VBA 2007 でテーブルのデータを取得した動的配列から、構造体定義した動的配列に入れたいのですが、コンパイルエラーが発生してしまいます。 ネットで調べたのですがわからずじまいで、ここで相談させていただいています。 やりたいことは、テーブルの内容全てを動的配列に入れたい、それだけです。 やり方には固執していませんので、よろしくお願いします。 [コンパイルエラー] パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。 [実際のプログラム]Form内のボタン押下時に実行される Private Sub btn_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim varRecords As Variant Dim intRecCnt As Integer Set db = CurrentDb() Set rst = db.OpenRecordset(テーブル名称, dbOpenSnapshot) rst.MoveLast: rst.MoveFirst intRecCnt = rst.RecordCount varRecords = rst.GetRows(intRecCnt) Dim COutRec() As Record '行ループ For intRLoop = 0 To UBound(varRecords, 2) ReDim Preserve COutRec(intRLoop) '列方向(フィールド)のループ For intCLoop = 0 To UBound(varRecords, 1) '配列の各データを配列にセット COutRec(intRLoop, intCLoop) = varRecords(intCLoop, intRLoop) Next intCLoop Next intRLoop End Sub [構造体定義]標準モジュール内に定義している Type Record A As String B As String End Type

  • メールの送信について

    ASPを使ってwebアプリ見たいなのを作ろうとしています。 データの登録時に予め登録されてているユーザに登録された旨を伝える メールを送信したいです。 いろいろ試した結果、直でbsap21を呼び出すのではなく、bsmtp.dllを 呼び出して送信するほうが動きがいい(というか、basp21のほうはSMTPサーバに接続しない)ので、その方向で行きたいのですが。。。 見つけたコードが以下です。 ------------------------------------------------------------ Private Declare Function SendMail Lib "bsmtp"_ (strServer As String, strTo As String, strFrom As String, _ strSubject As String, strBody As String, strFile As String) As String Public Function SendViaBASP() As String Dim strMailServer As String: strMailServer = "***.***" Dim strFrom As String: strFrom = "hoge@hoge.com" Dim strTo As String: strTo = "hoge@hoge.com" Dim strBcc As String: strBcc = "" Dim strToBcc As String: strToBcc = "" Dim fHTML As Boolean: fHTML = False Dim strSubject As String Dim strBody As String Dim strAttachments As String: strAttachments = "" Dim strRet As String strSubject = "BASP21" strBody = "このメールは、BASP21経由で送信しました." If Len(strTo) Then strToBcc = strTo Else strToBcc = strBcc End If If fHTML Then strToBcc = ">Content-Type: text/html; charset=iso-2022-jp" _ & vbTab & strToBcc End If strRet = SendMail(strMailServer, _ strToBcc, strFrom, strSubject, strBody, _ strAttachments) SendViaBASP = strRet End Function --------------------------------------------------------------- で、これをACCESSのモジュールに登録し、実行したところ問題なく 動くのですが、これをASPに組み込む方法がわかりません。 ACCESSはデータの登録先ではありますが、常に起動しているわけでは ないので、おそらくモジュールとした場合、動かないですよね? ASPから上記のコードを動かすには、どうしたらいいでしょうか。 普通にASPの中(<%~%>)に入れると「ステートメントの末尾が不正」 とのメッセージがでてしまいます。 どうかよろしくお願いします。

  • レコードセットのオープン

    修行中のものです。。。 エラーが発生してしまします。 間違いの点をお教え下さい。 自分的には”レコードセットのオープン”がいまいち分かりません。 【 objCon.Open 】 Dim objCon Dim objRS '##### コネクションオブジェクトの生成 ##### Set objCon = Server.CreateObject("ADODB.Connection") '##### レコードセットオブジェクトの生成 ##### Set objRS = Server.CreateObject("ADODB.Recordset") '##### 接続用パレメータの設定 ##### objCon.Provider = "Microsoft.Jet.OLEDB.4.0" '##### MDBの絶対パス指定 ##### objCon.ConnectionString = (Server.MapPath("/") & "データベース") '##### コネクションのオープン ##### objCon.Open '##### データ参照 ##### objRS = "select [ID],[NAME],[URL],[CM1],[CM2],[CM3] from SITE_DATA" %> レコード件数 <%=objRS.RecordCount%> <hr> <% '##### レコードセットのクローズ ##### objRS.Close Set objRS = Nothing '##### コネクションのクローズ ##### objCon.Close Set objCon = Nothing %> お願いします