今回、初めてADOを使ってみたが、ADOの解説文をネットで読みかじって書いたこともあって、能率が悪かった。
以下、Copilotで確認しながら修正した項目。
1.DLookup、DSum、DMax、DCountはDAOのリンクテーブルを使っている可能性があるので、それ用の読み替え関数を作成した。
adoDLookup、adoDSum、adoDMax、adoDCount
2.大体こんな感じで書く
標準モジュール
Public con As New ADODB.Connection
メニューフォームでconnect (メニューフォームは最初に開いて、以降、アプリケショーンを閉じるまで開いたまま。最後に閉じる。)
con.ConnectionString = pstrAdoCon
con.Open
フォームデバッグ中にconが閉じてしまうので、conを使う前に一応、開いているか確認して閉じていれば開く
If con.State = adStateClosed Then con.ConnectionString = pstrAdoCon: con.Open
終了処理。閉じたままでcon.Closeしてもエラーにならないのだが、一応、状態を確認してCloseする
If con.State = adStateOpen Then con.Close: Set con = Nothing
conがNew されているかどうかは
if con is nothing then msgbox "Newされてない"
recordsetはプロシージャー単位で作成する。
Dim rst As New ADODB.Recordset
Dim strSQL As String
戻り値が不要な場合
con.Execute strSQL
戻り値が必要な場合
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic
「ret rst = con.Execute(strSQL) 」は動作が不安定とのこと
終了処理。rst.CloseはNewさえしてれば、何回Closeしてもエラーにならないが、Newしてない時は下記でもエラーになる。
If rst.State = adStateOpen Then rst.Close: Set rst = Nothing
recordsetがNewされているかどうかは、下記で確認
if rst is nothing then msgbox "Newされてない"
conにしてもrecordsetにしても、デバッグ中、状態がはっきりしないので、確認してからopenするなり、closeした方がよさそう。
3.conは一度開いたらアプリケーション終了時まで閉じない。閉じたり開いたりすると時間がかかる。
モジュール単位で開け閉めするように説明してあったが、アプリケーション単位にした。
作成したadoDLookup、adoDSum、adoDMax、adoDCountでもconを使っているので、いちいち閉じていたら時間がかかってしょうがない。
conはPublicで宣言して使い回しても問題ない。
4.recordset名はプロシージャーが別なら、同一のconで開いても区別される。
5.テーブルにデータを追加する場合
テーブルが小さい場合は
con.Execute strSQL
テーブルが大きい場合
strSQL = "select * from TableMei where 1=0"
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic
rst.AddNew
rst.Update
「where 1=0」がないとOpenした時、全件取得してしまう。これがあると、1件も取得されないので、recordsetだけ用意される。
(この説明がないので、どうして時間がかかってしまうのかわからなかった)
「where 1=0」を追加して、recordsetを開くように修正して、やっとDAOより速くなった。
DAO 10秒、ADO 7秒。
これでも遅いので、やはりRemotoDeskTopにするしかなさそう。
6.データを更新する場合
やはり、テーブルが小さい場合は
con.Execute strSQL
こっちの方がいいらしい(2025/10/12)
Dim cmd As new ADODB.Command
cmd.ActiveConnection = con
cmd.CommandType = asCmdText
cmd.CommnadText = strSQL
cmd.Execute
Set cmd = Nothing
項目が多かったり、複数行修正する場合はrecordsetを使って
strSQL = "select * from TableMei where Unnunn"
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic
do until rst.eof
rst.Update
rst.movenext
loop
DAOの場合に必要なrst.Editは不要
7.選択レコードが無かった場合
strSQL = "select * from TableMei where Unnunn"
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic
if rst.eof and rst.bof then msgbox "選択されたレコードがない!"
rst.close : set rst = nothing
8.where句で日付を指定する時はPostgreSQLの標準の書き方
'yyyy-mm-dd'
とすること。
" ' " & format(date, "yyyy-mm-dd") & " ' "