#23 | DAOとADOを比較する | ||||||||||||||||
Access2000から、Accessの扱うデータベースの形式が2つになりました。従来からあったMDBファイルと新しいADPファイルです。また、これに対応した形でデータアクセスの方法も従来のDAO(Data Access Object)に加えてADO(Microsoft ActiveX Data Objects)が本格的に加わることとなりました。SQL Serverのようなサーバーベースのデータベースをバックエンドとして扱う場合、ADPでAccessのデータベースを構築することによって従来の開発環境にはなかったさまざまな恩恵を得ることができます。しかし、かといって従来のODBC経由のリンクテーブルへのアクセスやパススルークエリー、ODBC Directを使ったストアドプロシージャの実行などがMDBファイルでできなくなったわけではありません。また、ADOによるローカルのMDBファイルに対するアクセスも可能です。これらのことは開発者にとって選択肢が広がったといえる反面、開発するデータベースによってはいったいどれを使うべきか迷うことが増えたともいえるでしょう。クライアントサーバー環境ならADP+ADOという選択を簡単に導き出すことができるかもしれませんが、ローカルのMDBファイルを使ったデータベースを作ろうという場合にはいったい何を根拠にDAO/ADOを選択すればよいのでしょうか?。DAOは歴史も古くAccessネイティブなオブジェクトであることから、Accessでの安定した動作を期待できますし、ADOはこれからのオブジェクトですので、将来に渡ってもプログラムがそのまま使えるという可能性を持っています。それぞれ一長一短あるので、なかなか難しい選択です。 【DAOのテストコード】 Dim dbs As Database Dim rst As DAO.Recordset Dim ilngLoop As Long Dim varDummy As Variant Const clngRecMax As Long = 10000 Set dbs = CurrentDb Set rst = dbs.OpenRecordset("tblTest") ts_watch "テスト開始", True 'レコードを追加 For ilngLoop = 1 To clngRecMax With rst .AddNew !Data1 = ilngLoop !Data2 = ilngLoop * 2 !Data3 = "ABC" !Data4 = "EFG" .Update End With Next ilngLoop ts_watch "レコード追加" 'レコード読み込み rst.MoveFirst For ilngLoop = 1 To clngRecMax With rst varDummy = !Data1 varDummy = !Data2 varDummy = !Data3 varDummy = !Data4 .MoveNext End With Next ilngLoop ts_watch "レコード読み込み" 'レコード更新 rst.MoveFirst For ilngLoop = 1 To clngRecMax With rst .Edit !Data2 = ilngLoop * 3 !Data3 = "HIJK" !Data4 = "LMN" .Update .MoveNext End With Next ilngLoop ts_watch "レコード更新" 'レコード削除 rst.MoveFirst For ilngLoop = 1 To clngRecMax With rst .Delete .MoveNext End With Next ilngLoop ts_watch "レコード削除" rst.Close dbs.Close 【ADOのテストコード】 Dim cn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim ilngLoop As Long Dim varDummy As Variant Const clngRecMax As Long = 10000 Set cn = CurrentProject.Connection rst.Open "tblTest", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect ts_watch "テスト開始", True 'レコードを追加 For ilngLoop = 1 To clngRecMax With rst .AddNew !Data1 = ilngLoop !Data2 = ilngLoop * 2 !Data3 = "ABC" !Data4 = "EFG" .Update End With Next ilngLoop ts_watch "レコード追加" 'レコード読み込み rst.MoveFirst For ilngLoop = 1 To clngRecMax With rst varDummy = !Data1 varDummy = !Data2 varDummy = !Data3 varDummy = !Data4 .MoveNext End With Next ilngLoop ts_watch "レコード読み込み" 'レコード更新 rst.MoveFirst For ilngLoop = 1 To clngRecMax With rst !Data2 = ilngLoop * 3 !Data3 = "HIJK" !Data4 = "LMN" .MoveNext End With Next ilngLoop ts_watch "レコード更新" 'レコード削除 rst.MoveFirst For ilngLoop = 1 To clngRecMax With rst .Delete .MoveNext End With Next ilngLoop ts_watch "レコード削除" rst.Close Set rst = Nothing cn.Close Set cn = Nothing テスト結果は次の通りです。 テスト項目ごとにかなり微妙な違いが出ています。レコードの追加ではDAOの方が高速ですが、読み込みではADOの方が高速です。レコードの更新処理については、ADOの場合はEditメソッドやUpdateメソッドを使う必要がないのでそれが何らかの影響を与えるのではないかと考えましたが、ほとんど同じ時間で結果的には関係なかったようです。レコード削除については比較的大きな違いが現れています。DAOの方がかなり高速であることが分かります。 両者に極端な差が出ているわけではないので優劣をつけるのは難しいところですが、全体的にはDAOの方が若干優位なようです。古株となったしまったDAOですが、少なくてもMDBファイルとしてローカルで使う限りにおいては、あわててADOを導入する必要もなさそうです。特にそのような環境で使っているAccess97のデータベースをAccess2000に更新しようとする場合、これといった機能アップを行わないのであれば、データアクセスの部分だけに時間を掛けてADOに書き換えるメリットはまったくないといえるでしょう。 |
|||||||||||||||||
|
Copyright © T'sWare All rights reserved |