DAO から ADO への移植 1

Jet Provider と組み合わせた ADO の使用

Alyssa Henry

ページの表示: 1 2 3 4 5 6 7 8 9 10 11

はじめに

この文書は、通常 Microsoft® Data Access Objects(DAO)を使用してプログラミング作業を行っているコードを、等価な Microsoft ActiveX® Data Objects(ADO)を使用するコードに移植するためのガイドです。DAO と ADO 間のオブジェクト、プロパティ、およびメソッドのマッピングを説明します。また、両方で似たような名前のメソッドまたはプロパティの機能や意味に違いがあれば、それらについても説明します。

この文書は、ADO と OLE DB Provider for Microsoft Jet (Microsoft Jet Provider) を使用して新しいコードを記述する場合のガイドでもあります。Jet Provider の多数の機能を説明し、それを ADO で使用する方法を示します。ADO のマニュアルはプロバイダに中立に記載されているので、こういった情報の多くが不足しています。

この文書では特定のオブジェクト、プロパティ、またはメソッドの詳細は説明しません。特定の項目の詳細については、DAO と ADO のオンライン マニュアルを参照してください。

DAO で提供されていた機能は、ADO では3つの異なるオブジェクト モデルによって提供されます。3 つのモデルとは、ADO、Microsoft ADO Extensions for DDL and Security (ADOX)、および Microsoft Jet and Replication Objects (JRO) です。DAO の機能が ADO で 3 つのモデルに分割されたのは、多くのアプリケーションは、これらの機能のサブセットのうちいずれか 1 つしか必要としないためです。機能を分割したことで、アプリケーションはメモリに不要な追加情報を読み込むオーバーヘッドが必要なくなりました。以下のセクションでは、この 3 つのオブジェクト モデルの概要を説明します。


ADO: データ操作

ADO を使用することにより、クライアント アプリケーションは任意のOLE DB プロバイダ経由でデータ アクセスとデータ操作が可能になります。ADO にはデータソースへの接続、データの読み取り、追加、更新、削除のためのオブジェクトが含まれています。

Cc948691.ADOobjectModel(ja-jp,MSDN.10).gif


ADOX: データ定義とセキュリティ

ADOX モデルには、テーブル、ビュー、およびインデックスなどデータの定義や、ユーザーとグループの作成と変更をするためのオブジェクトが含まれています。管理者は ADOX を使用して、データベース スキーマの制御や、オブジェクトに対するユーザーとグループの権限の許可と禁止を設定できます。

ADO と ADOX では、Connection オブジェクトは、データ ソースのユーザーのセッションを定義します。Catalog オブジェクトは、データ定義コレクション (TablesProcedures、および Views) とセキュリティ コレクション (UsersGroups) のコンテナです。各 Catalog オブジェクトは、元になるデータ ソースへの Connectionに対して 1 つだけ関連付けられます。

ADOX モデルは、DAO モデルとはいくぶん異なります。DAO はユーザーのセッションを定義する Workspace オブジェクトは持ちますが、データ ソースは定義しません。Workspace オブジェクトは、UsersGroups コレクションのコンテナにもなります。Workspace が作成されると、データベースを開かずにセキュリティ情報を取得または変更できます。

Cc948691.ADOXobjectModel1(ja-jp,MSDN.10).gif

ADO の TableIndex、および Column の各オブジェクトは、標準のADO Properties コレクションを持ちます。

Cc948691.ADOXobjectModel2(ja-jp,MSDN.10).gif


JRO: レプリケーション

JRO モデルには、複製の作成、変更、および同期をとるためのオブジェクト、プロパティ、およびメソッドが含まれています。これは Jet Provider 専用に設計されています。ADO や ADOX とは異なり、JRO は Microsoft Jet データベース以外のデータ ソースには使用できません。

JRO モデルの主要なオブジェクトは Replica オブジェクトです。Replica オブジェクトは、新しい複製の作成、既存の複製のプロパティの取得と変更、ほかの複製との変更の同期をとるために使います。この点も DAO と違います。DAO では、これらの作業に Database オブジェクトを使います。

また、JRO には、Microsoft Jet データベース エンジンに固有の 2 つの機能である、データベースの圧縮とメモリ キャッシュからのデータの更新のための、JetEngine オブジェクトが含まれています。

Cc948691.JROobjectModel(ja-jp,MSDN.10).gif

入門

本書のサンプル コードを実行するには、データベースまたはプロジェクト内で ADO、ADOX、および JRO タイプ ライブラリを参照する必要があります。新しい Microsoft Access 2000 データベースには標準で ADO への参照が含まれています。しかし、サンプルを実行するには、ADOX と JRO への参照を追加する必要があります。既存のデータベースを Access 2000 に変換した場合や、Microsoft Visual Basic® などのアプリケーションを使用してプログラミングする場合には、すべての参照をユーザー自身で含める必要があります。

Access 2000 で参照を追加するには、以下のようにします。

  1. モジュールを開きます。
  2. [ツール] メニューの [参照設定… ] を選択します。
  3. リストから [Microsoft ActiveX Data Objects 2.1 Library] を選択します。
  4. リストから [Microsoft ADO Ext. 2.1 for DDL and Security] を選択します。
  5. リストから [Microsoft Jet and Replication Objects 2.1 Library] を選択します。
  6. [OK] をクリックします。

Visual Basic で参照を追加するには、以下のようにします。

  1. プロジェクトを開きます。
  2. [プロジェクト] メニューの [参照設定… ] を選択します。
  3. リストから [Microsoft ActiveX Data Objects 2.1 Library] を選択します。
  4. リストから [Microsoft ADO Ext. 2.1 for DDL and Security] を選択します。
  5. リストから [Microsoft Jet and Replication Objects 2.1 Library] を選択します。
  6. [OK] をクリックします。

同じプロジェクトに、ADO と DAO の両方の参照を含める場合は、オブジェクトを宣言するときに、どちらのライブラリを使用するかを明示的に指定する必要があります。DAO と ADO にはいくつか同じ名前のオブジェクトが含まれているためです。たとえば、どちらのモデルにも Recordset オブジェクトが含まれているので、次のコードはあいまいです。

Dim rst as Recordset

使用するオブジェクト モデルを指定するには、次のように修飾子を含める必要があります。

Dim rstADO As ADODB.Recordset

Dim rstDAO As DAO.Recordset

修飾子を省略すると、Visual Basic for Applications (VBA) は先に参照されたモデルのオブジェクトを選択します。したがって、[参照設定]ダイアログ ボックスの参照リストが以下の順序で並んでいる場合、修飾子なしの Recordset として宣言されているオブジェクトは、DAO の Recordset になります。

Visual Basic For Applications

Microsoft DAO 3.6 Object Library

Microsoft ActiveX Data Objects 2.1 Library

Microsoft ADO Ext. 2.1 for DDL and Security

Microsoft Jet and Replication Objects 2.1 Library


データベースを開く

通常、データにアクセスするアプリケーションを記述するときの最初の手順は、データ ソースを開く処理です。Microsoft Jet データベース エンジンを使用している場合は、Microsoft Jet データベース、Microsoft Jet の ISAM コンポーネントを使用した Microsoft Excel、Paradox、および dBASE などの外部データ ソース、および ODBC データ ソースを開けます。

Microsoft Jet データベース

Jet Provider は Microsoft Jet 4.0 データベースと以前のバージョンの Jet データベース エンジンで作成されたデータベースを開けます。

以下のコードは、Microsoft Jet データベースを共有更新アクセス モードで開く方法を示します。ここでは開き方を示すことだけが目的なので、このコードでは開いたデータベースをすぐに閉じるようになっています。

DAO

Sub DAOOpenJetDatabase()
    Dim db As DAO.Database
    Set db = DBEngine.OpenDatabase("C:\Nwind.mdb")
    db.Close
End Sub

ADO

Sub ADOOpenJetDatabase()
    Dim cnn As New ADODB.Connection
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Nwind.mdb;"
    cnn.Close
End Sub

データベースを開くための 2 つのコード リストは、いくぶん違って見えますが、まったく異なるわけではありません。オブジェクトの名前が違うことを除けば、主な違いはデータベースを開くためのメソッドに渡される文字列の書式です。

この例の ADO の接続文字列は、プロバイダ タグとデータ ソース タグの 2 つの部分に分かれています。プロバイダ タグはどの OLE DB プロバイダを使うかを示し、データ ソース タグはどのデータベースを開くかを示します。DAO では、Microsoft Jet を使うことを前提としていますが、ADO では Microsoft Jet を使うことを明示する必要があります。

特に指定しない限り、Jet Provider を使用する場合、DAO と ADO はどちらも共有更新アクセス モードでデータベースを開きます。しかし、排他モードあるいは読み取り専用モードでデータベースを開きたい場合もあります。

次のコード リストは、DAO と ADO を使用してデータベースを共有読み取り専用モードで開く (そして、閉じる) 方法を示します。

DAO

Sub DAOOpenJetDatabaseReadOnly()
    Dim db As DAO.Database
    'Open shared, read-only.
    Set db = DBEngine.OpenDatabase("C:\nwind.mdb", False, True)
    db.Close
End Sub

ADO

Sub ADOOpenJetDatabaseReadOnly()
    Dim cnn  As New ADODB.Connection
    'Open shared, read-only
    cnn.Mode = adModeRead
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;"
    cnn.Close
End Sub

DAO のリストの OpenDatabase メソッドに対する 2 番目以降の 2 つのパラメータは、それぞれ共有および読み取り専用アクセスを示します。ADO のリストでは、Connection オブジェクトの Mode プロパティに読み取り専用定数 (adModeRead) を設定しています。特に指定しない限り、別のモード (たとえば、adModeShareExclusive) を設定しない限り、ADO の接続は共有更新アクセス モードで開かれます。

代わりに、ADO のリストは以下の 1 行のコードで記述することができます。

Sub OpenJetDatabaseExclusive()
    Dim cnn  As New ADODB.Connection
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\nwind.mdb;Mode=" & adModeRead
    cnn.Close
End Sub

このリストでは、Mode プロパティは Connection オブジェクトのプロパティとしてではなく、Open メソッドの接続文字列の一部として指定されています。ADO では、接続文字列を作成するために、ほかのプロパティと共にプロパティまたは文字列として、接続プロパティを設定できます。プロバイダ固有のプロパティ (Jet 固有のプロパティの場合はプレフィックスとして "Jet OLEDB:" を指定します) でも、接続文字列の一部として、または Connection オブジェクトの Properties コレクションと共に設定できます。使用できるプロパティの一覧については、この文書の後半にある「付録 B: プロパティ リファレンス」を参照してください。

Microsoft Jet データベース エンジンは、エンジンの動作方法を指定する数多くの設定可能なオプションを公開しています。これらのオプションが直接パフォーマンスに影響を与えることがよくあります。特に指定しない限り、Jet データベース エンジンが初期化されるときに、Windows のレジストリのキー \HKEY_LOCAL_MACHINES\Software\Microsoft\Jet で設定されている値が使用されます。実行時に一時的にこれらの設定を書き換えることができます。ADO では、これらの値は接続文字列の一部として設定されます。

次のリストは、エンジンの Page Timeout 設定を書き換え、書き換えた設定を使用して、データベースを開く方法を示しています。

DAO

Sub DAOSetJetDBOption()
    Dim db As DAO.Database
    Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
    DBEngine.SetOption dbPageTimeout, 4000
    db.Close
End Sub

ADO

Sub ADOSetJetDBOption()
    Dim cnn As New ADODB.Connection
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnn.Open "C:\nwind.mdb"
    cnn.Properties("Jet OLEDB:Page Timeout") = 4000
    cnn.Close
End Sub

DAO では、SetOption メソッドを使用して、これらのデータベース設定の値を設定します。値を取得する、GetOption メソッドに相当するものはありません。ADO では、Connection オブジェクトの Properties コレクション内のプロパティを使用します。ADO を使用して、プロパティの値を読み取ることができます。ただし、この値はそのプロパティの値を前もって設定していない限り正確ではありません。たとえば、Jet OLEDB:Page Timeout プロパティは、実際にレジストリ キー HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Jet 4.0\PageTimeout に 5000 が設定されていたとしても、この値を設定する前は値 0 が返ります。

ADO と DAO のその他のわずかな違いは、ADO では Connection を開いた後でしかこれらのプロパティを使用できないことです。DAO では、データベースを開く前に、DBEngine オブジェクトでこれらのプロパティを設定できます。

リストでも示したように。接続文字列ではなく、オプションの Provider プロパティでプロバイダを設定できます。接続文字列の "Data Source=" セクションも省略できます。省略した場合は、ADO は接続文字列のパスの既定値であると想定します。これは単なる接続を開く代替メソッドです。ADO にはある作業を達成するための等価で、有効な方法が多く存在する場合があります。この文書の後半の、「ユーザー レベル セキュリティのデータベースを開く」では、接続文字列ではなく、Provider プロパティでプロバイダを示す必要がある個所の例を示しています。

以下の表は、DAO の SetOption メソッドで設定できる値と ADO でそれに対応するプロパティを一覧しています。

DAO 定数 ADO プロパティ
dbPageTimeout Jet OLEDB:Page Timeout
dbSharedAsyncDelay Jet OLEDB:Shared Async Delay
dbExclusiveAsyncDelay Jet OLEDB:Exclusive Async Delay
dbLockRetry Jet OLEDB:Lock Retry
dbUserCommitSync Jet OLEDB:User Commit Sync
dbImplicitCommitSync Jet OLEDB:Implicit Commit Sync
dbMaxBufferSize Jet OLEDB:Max Buffer Size
dbMaxLocksPerFile Jet OLEDB:Max Locks Per File
dbLockDelay Jet OLEDB:Lock Delay
dbRecycleLVs Jet OLEDB:Recycle Long-Valued Pages
dbFlushTransactionTimeout Jet OLEDB:Flush Transaction Timeout

ページの表示: 1 2 3 4 5 6 7 8 9 10 11

表示: