エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。
Dim rst As New ADODB.Recordset
rst.CursorType = adOpenStatic
と「adOpenStatic」に設定したいのですが、
Set rst = con.Execute(sql_str, , adCmdText)
のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。
(設定直後に調べると、ちゃんとadOpenStaticになっています)
「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。
CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、
CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。
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 & ";"
rst.CursorType = adOpenStatic
rst.LockType = adLockReadOnly
MsgBox "前 = " & rst.CursorType
Set rst = con.Execute(sql_str, , adCmdText)
MsgBox "後 = " & rst.CursorType
No.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
この回答への補足
すみません、先日返信したつもりが、反映されていませんでした。
ソースありがとうございました。
こちらで実行してみましたが、
>Rst.Open , Cmd, adOpenStatic, adLockReadOnly
でエラーがでていしまいました。
エラーメッセージは以下の通りです。
「3001(引数が間違った型、許容範囲外、または競合してます)」
その際、指定の場所で設けたブレークポイントで変数の中身を見ると、以下のようになっていました。
: RecordCount : <オブジェクトが閉じている場合は、操作は許可されません。> : ADO_LONGPTR
データベースのファイルの方がおかしいのかと、簡単なデータベースを作って試してみましたが、結果はかわりませんでした。
こうなると、ソース上というより、エクセルやアクセスの何かの設定が足りないのだろうかと思ったりもします。
何かお知りでしたらご教授いただけるとありがたいです。
以上、よろしくお願いします。
No.2
- 回答日時:
>上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
No.1
- 回答日時:
以下のように設定しなければ、デフォルトになるだけではありませんか?
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が変更してしまいました。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- BTOパソコン dz60 1 2023/06/11 15:27
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
ADOのCursorLocationプロパティ
Visual Basic(VBA)
-
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
Access200 ADO adLockPessimisticとadLockOptimisticの違い
Access(アクセス)
-
-
4
ADO VBA 実行時エラー3021
Visual Basic(VBA)
-
5
Access レポート印刷するときに1ページに収める方法
Access(アクセス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access レポート印刷するときに...
-
Accessが強制終了する理由はな...
-
実行時エラー3131 FROM 句の構...
-
access2021 強制終了してしまう
-
Microsoft365にAccessってあり...
-
チェックボックスにチェックが...
-
Accessのクエリで、replace関数...
-
access2019 チェックボックスと...
-
CSVファイルの「0落ち」にVBA
-
Access VBA [リモートサーバー...
-
accessのフォームに設置したボ...
-
Access IF文でテーブルに存在し...
-
Accessのリンクテーブルのパス...
-
Access で半角スペースと全角ス...
-
Accessレポートのチェックボッ...
-
access2021 VBA メソッドまたは...
-
Accessのデータ型の日付/時刻型...
-
【至急・画像あり】建物or住所...
-
エクセルのマクロについて教え...
-
エクセルのVBAについて教えてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAからaccessへの接続で、Reco...
-
Accessで "WTH COMPRESSION"
-
SQLを使うには
-
Jet データベースエンジンって...
-
Oracle 8i コンマ(,)を含むデ...
-
SQLサーバー接続 特定のPCがWin...
-
SQLのエラー(~付近に不適切な...
-
PostgreSqlでFunctionの作成に...
-
Access2010 accdbのエラー「ODB...
-
既定のインスタンスと名前付き...
-
ノートンの解約(「ライセンス...
-
Excel-VBAの「しばらくお待ちく...
-
SQL Loaderを使いたい
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
GROUP BYでエラーが発生
-
エクセルマクロで指定範囲内の...
-
ユーザー定義関数内でのsp_exec...
-
ACCESS ADOでupdateが効かない
-
ノートパソコンのHDDを同機種へ...
-
symfowareへのODBC接続方法
おすすめ情報