DAOとADOの併用に関して

解決


じん  2010-11-10 10:11:14  No: 102686  IP: [192.*.*.*]

下記リンクの続きになります。
下記リンクで最後に質問したものを変更し、新規で質問します。

http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+201011/10110008.txt

> DAO と ADO を併用しているのですね?
とありますが、それはどういった点からそういえるのか教えてください。

ADODB.Connection.open     →  これはADO
DBEngine.CompactDatabase  →  これはDAO
というところからでしょうか?

また併用している場合、参照設定にMicrosot Office 12.0 Access database…を設定してProviderにMicrosoft.ACE.OLEDB.12.0
とする。これはDAO?

いちお参照設定に
Microsoft ActiveX Data Objects 2.5 Library(これはADOのため?)
Micrasoft Office 12.0 Access database engine Object Library(これはDAOのため?)
が現在設定しています。
もしくわほかの設定が意味あるのですか?

全然見当違いのことを言っていたら、申し訳ありません。

よろしくお願いします。

編集 削除
魔界の仮面弁士  2010-11-10 10:57:26  No: 102687  IP: [192.*.*.*]

>> DAO と ADO を併用しているのですね?
> とありますが、それはどういった点からそういえるのか教えてください。
> ADODB.Connection.open     →  これはADO
> DBEngine.CompactDatabase  →  これはDAO
> というところからでしょうか?

ですます。

複数の接続を併用すると、DAO による接続と ADO による接続が発生するため、
トランザクション管理の観点からは、あまり望ましいものではありません。
特に、キャッシュの更新時間差の問題が生じる可能性があります。
http://www.canalian.com/workshop/access/JetCache.html


しかしながら、DAO にしかできない機能や ADO が得意とする分野もあるので、
時として、両者を併用する事があるのもまた事実です。

ざっくりいうと、mdb / accdb を扱うのであれば、DAO が最良のミドルウェアと言えます。

DAO と ADO の処理速度を考えると、ADODB は OLEDB 層を経由する必要があるため、
多くの場合には DAO の方が良好なパフォーマンスを得られます。

また、accdb の Attachment型を扱いたい場合や、accdb の最適化を行いたい場合、
Access 2007 / 2010 対応版の DAO を使う必要がありますし、
動的プロパティ(Property オブジェクト)の作成についても、DAO でないと行えません。

しかしながら、DAO はカーソルベースの設計になっており、ADO では可能な非接続型の
利用方法がサポートされていません。また、VB6(≠Access)でデータバインドする場合、
ADO の方に大きなアドバンテージがあります。

そのため、やりたい要件に合わせてどちらが最適かを判断したうえで、どうしても
両方を使わなければ実現できない場合に限り、DAO + ADO を併用すると良いでしょう。


> また併用している場合、参照設定にMicrosot Office 12.0 Access database…を設定して
> ProviderにMicrosoft.ACE.OLEDB.12.0とする。これはDAO?

《ADO の場合》
  '参照設定して利用する場合のコード例
  Dim cn As ADODB.Connection
  Set cn = New ADODB.Connection
  cn.Provider = "Microsoft.ACE.OLEDB.12.0"
  cn.Properties("Data Source").Value = "C:\db1.accdb"
  cn.Open
  Dim rs As ADODB.Recordset
  Set rs = cn.Execute("SELECT * FROM TBL")


  '参照設定せずに利用する場合のコード例
  Dim cn As Object
  Set cn = CreateObject("ADODB.Connection")
  cn.Provider = "Microsoft.ACE.OLEDB.12.0"
  cn.Properties("Data Source").Value = "C:\db1.accdb"
  cn.Open
  Dim rs As Object
  Set rs = cn.Execute("SELECT * FROM TBL")



《DAO の場合》

  '参照設定して利用する場合のコード例
  Dim de As DAO.DBEngine
  Set de = New DAO.DBEngine
  Dim ws As DAO.Workspace
  Set ws = de.CreateWorkspace("#Default Workspace#", "Admin", "")
  Dim db As DAO.Database
  Set db = ws.OpenDatabase("C:\db1.accdb")
  Dim rs As DAO.Recordset
  Set rs = db.OpenRecordset("SELECT * FROM TBL")


  '参照設定せずに利用する場合のコード例
  Dim de As Object
  Set de = CreateObject("DAO.DBEngine.120")
  Dim ws As Object
  Set ws = de.CreateWorkspace("#Default Workspace#", "Admin", "")
  Dim db As Object
  Set db = ws.OpenDatabase("C:\db1.accdb")
  Dim rs As Object
  Set rs = db.OpenRecordset("SELECT * FROM TBL")


> もしくわ
  もしくは

編集 削除
じん  2010-11-10 11:14:11  No: 102688  IP: [192.*.*.*]

毎度、丁寧な説明ありがとうございます。

どこかでしらべたら、ADOの設定に必要だとかいてあったのですが、
Microsoft ActiveX Data Objects 2.5 LibraryはDAOのみの場合は必要ないのですか?

とにかくADO、DAOを使用する場合データベースにアクセスするめに
Microsot Office 12.0 Access database…(ACEDAO.DLL)を使用するのですね。
参照設定する場合はACEDAO.DLLを参照しているのはわかるのですが、しない場合もコード例でCreateObjectしたときにACEDAO.DLLを参照していることになるのですか?

編集 削除
魔界の仮面弁士  2010-11-10 11:30:28  No: 102689  IP: [192.*.*.*]

> どこかでしらべたら、ADOの設定に必要だとかいてあったのですが、
具体的にはどこですか? Web でしょうか書籍でしょうか。
また、それは VB6 の話でしたでしょうか。それとも Access VBA の場合でしょうか。


> Microsoft ActiveX Data Objects 2.5 LibraryはDAOのみの場合は必要ないのですか?
上記は、DAO (Data Access Object)での接続には利用されません。
DAO ベースの開発を行うなら、これを参照設定する必要は無いでしょう。


それが必要になるのは、ADO (ActiveX Data Object) で接続する場合ですね。
ADO のバージョンの違いについても留意しておいてください。
http://support.microsoft.com/kb/301202/ja
http://www.atmarkit.co.jp/fwin2k/win2ktips/912mdacupg/mdacupg.html

編集 削除
魔界の仮面弁士  2010-11-10 11:38:17  No: 102690  IP: [192.*.*.*]

> CreateObjectしたときにACEDAO.DLLを参照していることになるのですか?

なります。

以下、細かい点を端折って書くと:

> Set de = CreateObject("DAO.DBEngine.120")
この時点で、レジストリの下記項目が参照されます。

  HKEY_CLASSES_ROOT\DAO.DBEngine.120

この下には CLSID というキーがあり、そこには
{CD7791B9-43FD-42C5-AE42-8DD2811F0419}
と記載されています。


次に、そこに記載された値から下記のキーが参照されます。

HKEY_CLASSES_ROOT\CLSID\{CD7791B9-43FD-42C5-AE42-8DD2811F0419}

この中には、DLL の場所等が記載されています。私の環境では、
上記の InprocServer32 というキーのところに
C:\PROGRA~1\COMMON~1\MICROS~1\OFFICE12\ACEDAO.DLL
と記録されていました。


そして実際、この ACEDAO.DLL を一時的にリネームした状態で
先のコードを実行してみると、
  Set de = CreateObject("DAO.DBEngine.120")
の行で、オートメーションエラー &H8007007E
『指定されたモジュールが見つかりません。』が発生することを確認できます。

編集 削除
じん  2010-11-10 13:06:07  No: 102691  IP: [192.*.*.*]

ありがとうございます。

参照設定しない場合でもレジストリ経由で参照しているのですね。

> 具体的にはどこですか? Web でしょうか書籍でしょうか。
Web上です。すいません、色々調べていた中での記憶なので具体的にどのサイトかは忘れてしまいました。
VB6の設定です。
どちらにしろ、ADOで接続の場合には必要で、バージョンの違いには魔界の仮面弁士さんが言われているように注意したいと思います。

色々丁寧にありがとうございました。だいぶすっきりしました。
また何かありましたら、よろしくお願いします。

編集 削除