エクセル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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで "WTH COMPRESSION"
-
GROUP BYでエラーが発生
-
ACCESS ADOでupdateが効かない
-
異なるサーバーにファイルをエ...
-
【Oracle】ADOでSELECT * FROM ...
-
ノートンの解約(「ライセンス...
-
ユーザー定義関数内でのsp_exec...
-
MSDEまたはSQLServerでReadOnly...
-
Access2010 accdbのエラー「ODB...
-
ACCESSからのODBC接続のみ応答...
-
エクセルマクロで指定範囲内の...
-
SQL Server 2008をインストール...
-
ACCESSで作成したアプリケーシ...
-
ストアドプロシージャでcsvファ...
-
エクセルからSQLサーバー ...
-
ストアドの速度がクエリの30...
-
ADOを利用したODBC、OLEDB経由...
-
別サーバーのDB同士を結合する...
-
oo4oのMovePreviousnメソッドに...
-
SQL Server 2008 r2 期限延長方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで "WTH COMPRESSION"
-
VBAからaccessへの接続で、Reco...
-
Oracle 8i コンマ(,)を含むデ...
-
GROUP BYでエラーが発生
-
SQLサーバー接続 特定のPCがWin...
-
SQLのエラー(~付近に不適切な...
-
Access2010 accdbのエラー「ODB...
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
ノートンの解約(「ライセンス...
-
PostgreSqlでFunctionの作成に...
-
エクセルマクロで指定範囲内の...
-
既定のインスタンスと名前付き...
-
sqlcmdでクエリの実行結果をバ...
-
Excel-VBAの「しばらくお待ちく...
-
ストアドの速度がクエリの30...
-
(SQLSERVER) 別サーバーへテー...
-
MSDEまたはSQLServerでReadOnly...
-
ユーザー定義関数内でのsp_exec...
-
SQL Loaderを使いたい
-
異なるサーバーにファイルをエ...
おすすめ情報