■102620 / inTopicNo.6) |
Re[4]: JRO を利用して READ キャッシュを更新 |
□投稿者/ 魔界の仮面弁士 (3722回)-(2023/11/26(Sun) 13:25:03)
|
■No102618 (eb さん) に返信 > 魔界の仮面弁士様のご投稿を見てこちらに伺ったのが経緯なので、 何処の投稿をご覧になったのかは分かりませんが、確かに過去に何度か紹介した覚えがあります。 ただ、Access VBA 特化のフォーラムが激減しているので、 最近は書いていないはずですし、紹介したサイトももう閉鎖しているんじゃないかな…?
> (canalian.com の記事もそうだったのでしょうか)。 あの記事を書いたのは私では無く、葛西邦生さんですね。長らくお会いしていないですけれど。
>> Access VBA なら、DAO(ACEDAO も含む) の方が融通が利くと思いますし、 >> パフォーマンス面でも DAO の方が有利かと。 > そうなんですね。個人的には ADO のほうが重要な技術だと思い込んでいました。 ADO が RDO や DAO の後継であることは確かですし、 異種データベース接続のインターフェイスという点においては ADO に軍配があがります。
一方、接続に必要なレイヤー数の違いといった要因により、 特定のデータベースに向けては、汎用ミドルウェアよりも 専用ミドルウェアの方が、パフォーマンスや機能面で有用なこともあります。 ミドルウェアによって、使用できる SQL 構文が微妙に異なる場合があるのが悩ましいところですが。
DAO → Jet → Access Database RDO → ODBC → Jet → Access Database ADO → OLE DB → Jet → Access Database ADO → OLE DB → ODBC → Jet → Access Database
また、歴史的な事情から、データベース側のバージョンによって、 適切なミドルウェアが変化することもあります。
対 SQL Server に関しても、従来の SQLOLEDB や SQL Server Native Client による接続から MSOLEDBSQL や ODBC による接続に切り替えるようアナウンスされていたりします。 https://learn.microsoft.com/ja-jp/sql/relational-databases/native-client/applications/using-ado-with-sql-server-native-client?WT.mc_id=DT-MVP-8907
個人的には、 Access VBA に限定していえば、ADO を使うことは少なくて、 もっぱら DAO を利用しています。(VB.NET などから利用する場合は、また別ですよ)
実際、後継バージョンでは ADODB が既定で参照されていなかったりもしていますし。 https://dxr165.blog.fc2.com/blog-entry-115.html
対 Access に限定して、「ADO にできて DAO にはできないこと」って何があるかな…。 Debug.Print CurrentProject.Connection.Properties("Jet OLEDB:Compact Reclaimed Space Amount").Value とかですかね。他にもあるかもしれませんが、ちょっと思い出せません。
逆に、ADO にできなくて DAO ならばできることと言えば、昔からの CreateProperty などが挙げられます。 新規データベースの作成などもそうですし(ADO の場合は ADOX の支援が必要)、 今回話題に挙げられた RefreshCache もそうですね(ADO の場合は JRO の支援が必要)。CompactDatabase もかな。
一方、レジストリベースで設定される個所については、共通して利用できるかと。 ただ、C2R (ClickToRun) の登場などもあり、レジストリの場所は変化しているのが厄介です。 実行計画を調べるための JETSHOWPLAN とか、今でも使えるんだろうか…? https://support.microsoft.com/ja-jp/office/8cc7bad8-38c2-4a7a-a604-43e9a7bbc4fb?WT.mc_id=DT-MVP-8907 https://social.msdn.microsoft.com/Forums/office/en-US/b786a029-fa8c-4556-a40c-e749ba73499e/jetshowplan-in-access2013
Access 関連で個人的に困っているのが、ISAMStats 関連。
従来の環境だと、こんな感じで取得できたのですが、 最近の環境だと、ADO でも DAO でも拾えなくなってしまっていて。
Debug.Print DBEngine.ISAMStats(0), "ディスク読取数" Debug.Print DBEngine.ISAMStats(1), "ディスク書込数" Debug.Print DBEngine.ISAMStats(2), "キャッシュからの読取数" Debug.Print DBEngine.ISAMStats(3), "キャッシュからの読取数" Debug.Print DBEngine.ISAMStats(4), "配置されたロック数" Debug.Print DBEngine.ISAMStats(5), "解除されたロック数" '以下は、JET 4.0 (DAO 3.6)環境で有効 Debug.Print DBEngine.ISAMStats(6), "レコードに記憶されたLVS数" Debug.Print DBEngine.ISAMStats(7), "共有ページに記憶されたLVS数" Debug.Print DBEngine.ISAMStats(8), "排他ページに記憶されたLVS数" Debug.Print DBEngine.ISAMStats(9), "LVSのページ数" Debug.Print DBEngine.ISAMStats(10),"レコードから移動されたLVS数" Debug.Print DBEngine.ISAMStats(11),"未使用のロード済みページ数" '事前に「DBEngine.ISAMStats 番号, True」を呼ぶと、各統計値がリセットされる
'ADO で取得する場合 Set Rs = Cn.OpenSchema(adSchemaProviderSpecific, , "{8703b612-5d43-11d1-bdbf-00c04fb92675}") ' 統計値のリセットは、OpenSchemaの実行前に、あらかじめ下記を呼ぶ ' Cn.Properties("Jet OLEDB:Reset ISAM Stats").Value = True 'False:蓄積、True:リセット
|
|