- ベストアンサー
VBAからAccessへの接続でRecordsetのCursorTypeが勝手に変更される
- エクセルVBAからAccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。設定直後に調べると、ちゃんとadOpenStaticになっていますが、Execute直後にadOpenForwardOnlyに変わってしまいます。
- CursorTypeをadOpenStaticに設定しても、クエリを実行した直後にadOpenForwardOnlyに変わってしまう原因を知りたいです。
- CursorTypeをadOpenStaticにしてRecordCountを使用したいのですが、CursorTypeが勝手に変更される問題に直面しています。原因を教えていただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ohnotellme 様。 Recordset の前に Commandを実行してから、Recordset を開けるのじゃないでしょうか? ここらになると、さすがに、SQL が手が出ないので、実際のところ確かめは出来てはいないのですが、以下に、一応、格好だけは出来ています。 UserFunction ですから、一応、貫通したら、ErrHandler のメッセージの部分は必要ありません。それと、Connectionは、開きっぱなしにしてよいのか、ここらは、まだ経験が浅いので、私には判断付きませんが、私の知っている範囲では、一旦閉じるようにすると聞いています。しかし、[閉じる]・[開ける]を繰り返すのは、その反応を異様に遅くするのです。それで、前回、ADO使って、Excel側からのコネクトする方法は、さじを投げてしまいました。 今回は、ほとんど自信がありませんので、そちら側で、ブレークポイントを設けて、ちょっと見てくださいませんか?私にとっても、ここはまだ勉強中で、もう少し余裕があれば、また違った回答ができるかと思いますが、それでも何とか解決までこぎつけたいです。 よろしくお願いします。 '-------------------------------------------------------- Public Function post_query(ByVal sql_str As String) As Integer Dim Con As New ADODB.Connection Dim Rst As ADODB.Recordset Dim Cmd As ADODB.Command Dim mdb_file As String mdb_file = "code.mdb" On Error GoTo DbClose Con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" Set Cmd = New ADODB.Command Set Cmd.ActiveConnection = Con With Cmd .CommandText = sql_str .CommandType = adCmdText .Execute End With Set Rst = New ADODB.Recordset Set Rst.ActiveConnection = Con Rst.Open ,Cmd , adOpenStatic, adLockReadOnly '※ここでチェック(Break Point地点) post_query = Rst.RecordCount DbClose: If Err.Number > 0 Then MsgBox Err.Number & "(" & Err.Description & ")" On Error GoTo 0 End If Con.Close Set Cmd = Nothing Set Rst = Nothing Set Con = Nothing End Function
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
>上2行を加えて、下2行をコメントアウトしてみましたが、やはりCursorTypeが変更してしまいました。。。 mySql ="Select...From...Where..... ;" これは、仮のSql の内容で、実際に、テーブルを開けないとダメなのです。SQLの内容は、こちらでは書けませんから、それをお作りなって、RecordSetをオープンされましたでしょうか? その上で、MsgBox ではなくて、どこか、ブレーキングポイントを設けて、ローカルウィンドウをお調べなればよいと思いますが。
補足
説明を省いて失礼しました。 クエリーの方こちらでちゃんと入れて、ブレーキポイントでみてみましたが、やはりダメでした。 以下の関数(件数を戻しつつ、結果をクラスのメンバで保持する)を作っているのですが、9の時点ですでにCursorTypeが変更されてしまっています。 お手数かけてすみません。 よろしくお願いします。 ----------------------------------------------- (1)Public Function post_query(ByVal sql_str As String) As Integer (2)Dim mdb_file As String (3)mdb_file = "code.mdb" (4)Set rst = Nothing (5)Set con = Nothing (6)con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" (7)rst.Open sql_str, con, adOpenStatic, adLockReadOnly (8)Set rst = con.Execute(sql_str, , adCmdText) (9)post_query = rst.RecordCount (10)End Function
- Wendy02
- ベストアンサー率57% (3570/6232)
以下のように設定しなければ、デフォルトになるだけではありませんか? Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" mySql ="Select...From...Where..... ;" rst.Open mySql, con, adOpenStatic, adLockReadOnly '←ここ 'rst.CursorType = adOpenStatic 'rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType
補足
>mySql ="Select...From...Where..... ;" >rst.Open mySql, con, adOpenStatic, adLockReadOnly '←ここ >'rst.CursorType = adOpenStatic >'rst.LockType = adLockReadOnly ありがとうございます。 上2行を加えて、下2行をコメントアウトしてみましたが、やはりCursorTypeが変更してしまいました。。。
補足
すみません、先日返信したつもりが、反映されていませんでした。 ソースありがとうございました。 こちらで実行してみましたが、 >Rst.Open , Cmd, adOpenStatic, adLockReadOnly でエラーがでていしまいました。 エラーメッセージは以下の通りです。 「3001(引数が間違った型、許容範囲外、または競合してます)」 その際、指定の場所で設けたブレークポイントで変数の中身を見ると、以下のようになっていました。 : RecordCount : <オブジェクトが閉じている場合は、操作は許可されません。> : ADO_LONGPTR データベースのファイルの方がおかしいのかと、簡単なデータベースを作って試してみましたが、結果はかわりませんでした。 こうなると、ソース上というより、エクセルやアクセスの何かの設定が足りないのだろうかと思ったりもします。 何かお知りでしたらご教授いただけるとありがたいです。 以上、よろしくお願いします。