アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル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

A 回答 (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

データベースのファイルの方がおかしいのかと、簡単なデータベースを作って試してみましたが、結果はかわりませんでした。

こうなると、ソース上というより、エクセルやアクセスの何かの設定が足りないのだろうかと思ったりもします。


何かお知りでしたらご教授いただけるとありがたいです。
以上、よろしくお願いします。

補足日時:2005/06/03 15:32
    • good
    • 0

>上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

補足日時:2005/05/31 16:20
    • good
    • 0

以下のように設定しなければ、デフォルトになるだけではありませんか?



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が変更してしまいました。。。

補足日時:2005/05/30 11:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!