AccessVBA/ADOX の変更点


*ADOXを使ったデータベース操作 [#q09f2e30]
ADOオブジェクトでは、データベースに含まれるテーブルやクエリの一覧を取得することができません。~
これらの処理を行うには、ADOXオブジェクトを利用します。

-ADOXオブジェクトを使って何ができるか?~
ADOXの各オブジェクトを利用すると、新規にデータベースやテーブル、クエリを作成したり、既存のテーブルやクエリの構造を変更したりすることができます。

#contents

**オブジェクトとコレクション [#ad50b3e3]
データベースに複数のテーブルやクエリを作成することができるように、Catalogオブジェクトにも複数のTableオブジェクトやViewオブジェクト、Procedureオブジェクトが含まれます。~
同じ種類のオブジェクトの集まりをコレクションと呼びます。~
コレクション名はオブジェクト名の複数形になります。

 Catalogオブジェクト
      |
      |---Tableコレクション
      |   table(0) talble(1) table(2)・・・・---------------------Tableオブジェクト
      |                                                                    |
      |---Viewコレクション                                                 |--Columnsコレクション
      |   View(0) View(1) View(2)・・・・                                  |  Column(0) Column(1) Column(2)・・・
      |                                                                    |
      |---Proceduresコレクション                                           |--Indexesコレクション
          Procedure(0) Procedure(1) Procedure(2)・・・・                   |  Index(0) Index(1) Index(2)
                                                                           |
                                                                           |--Keysコレクション
                                                                              Key(0) Key(1) Key(2)

**&color(red){ADOXを利用する前に}; [#z63b9d82]
ADOXを利用するには、必要なライブラリを手動で追加しなければなりません。~
+Visual Basic Editorで[ツール] - [参照設定] メニュー選択
+ダイアログボックスで「Microsoft ADO Ext.2.5 for DDL and Security」を選択
+[OK]ボタンをクリック

**宣言 [#qcd12d2f]
ADOXオブジェクトを提供すうコンポーネントはADOXです。

-例1
 dim cat as New ADOX.Catalog

**データベースに接続する。 [#p0d835a5]
CatalogオブジェクトのActiveConnectionプロパティにデータベースへの接続情報を代入する。~
ADOのOpenメソッドのようなものはありません。

-カレントデータベースに接続
 catalog.ActiveConnection = CurrentProject.Connection

-他のデータベースに接続
 catalog.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                             & "Data Source=D:\Access\Sample.mdb"

-例1
 Public Sub adoxCurrentDB()
   Dim cat As New ADOX.Catalog
   cat.ActiveConnection = CurrentProject.Connection
   MsgBox "接続成功"
   Set cat = Nothing
 End Sub

**テーブルの一覧を取得する [#hb274bb2]
Tablesコレクションに含まれるすべてのTableオブジェクトからTypeプロパティの値が「TABLE」のものだけ抽出します。~

-書式
 For Each element In collection
   処理
 next element
 
 element     :コレクション内のオブジェクトを表すオブジェクト変数
 collection  :コレクション名

-例1
 Public Sub adoxTableList()
   Dim cat As New ADOX.Catalog
   Dim tb As New ADOX.Table
   cat.ActiveConnection = CurrentProject.Connection
   For Each tb In cat.Tables
     If tb.Type = "TABLE" Then
       Debug.Print tb.Name
     End If
   Next tb
    
   Set tb = Nothing: Set cat = Nothing
 End Sub

**クエリの一覧を取得する [#a01ac820]
カレントデータベースに含まれるクエリ名を、イミディエイトウィンドウに出力するプログラム
 Public Sub adoxQueryList()
   Dim cat As New ADOX.Catalog
   Dim vw As ADOX.View
   Dim proc As ADOX.Procedure
   cat.ActiveConnection = CurrentProject.Connection
   
   For Each vw In cat.Views
     Debug.Print vw.Name
   Next vw
   
   Debug.Print
   
   For Each proc In cat.Procedures
     Debug.Print proc.Name
   Next proc
   
   Set cat = Nothing
   
 End Sub

**テーブルを構成するオブジェクト [#mc865261]
Colummnsコレクションはテーブルに含まれるフィールド~
Indexsコレクションはテーブルに設定されているインデックスです。

-フィールドの名前やデータ型、サイズはColumnsオブジェクトの次のプロパティで調べることができます。

--Nameプロパティ       :フィールド名
--Typeプロパティ       :データ型
--DefindSizeプロパティ :サイズ

***フィールドの一覧を取得する [#z7cb2682]
テーブルを構成するフィールドは、TableオブジェクトのColumnsコレクションで管理されています。~
Columnsコレクションに含まれるすべてのColumnsオブジェクトのNameプロパティを調べると、フィールドの一覧が表示されます。

-書式
 Set table = catalog.Tables!tablename
 
 table     :Tableオブジェクト型のオブジェクト変数
 catalog   :開いているCatalogオブジェクト
 tablename :参照するテーブル名

-例~
[T_顧客]テーブルに含まれるフィールドの一覧を取得
 Public Sub adoxFieldList()
   Dim cat As New ADOX.Catalog
   Dim tb As ADOX.Table
   Dim col As ADOX.Column
   
   cat.ActiveConnection = CurrentProject.Connection
   Set tb = cat.Tables!T_顧客
   For Each col In tb.Columns
     Debug.Print col.Name, col.Type, col.DefinedSize
   Next col
   
   Set cat = Nothing: Set tb = Nothing: Set col = Nothing
 End Sub

***インデックス一覧を取得する [#m636e8b2]
テーブルに設定されているインデックスは、Indexesコレクションで管理されます。~
インデックスの名前や動作は、Indexオブジェクトの次のプロパティで調べることができます。

-Nameプロパティ       :インデックスの名前
-PrimaryKeyプロパティ :主キー(Trueの、主キーを表す)
-Uniqueプロパティ     :重複を許可するかどうか(Trueの時、重複した値を許可しない)
-IndexNullプロパティ  :Null値を許可するかどうか
                       adindexNullsDisallow  :Null値を許可しない
                       adindexNullsLgnore    :NULL値を許可する
-例
Public Sub adoxIndexList()
  Dim cat As New ADOX.Catalog
  Dim tb As ADOX.Table
  Dim col As ADOX.Column
  Dim idx As ADOX.Index
  
  cat.ActiveConnection = CurrentProject.Connection
  Set tb = cat.Tables!T_顧客
  
  For Each idx In tb.Indexes
    Debug.Print idx.Name, idx.PrimaryKey, idx.Unique, idx.IndexNulls
    For Each col In idx.Columns
      Debug.Print vttab & col.Name
    Next col
  Next idx
  
  Set tb = Nothing: Set col = Nothing: Set idx = Nothing: Set cat = Nothing
End Sub

**テーブルを作成する。 [#jeabf092]
+テーブルにフィールドを追加する
+必要であればインデックスを追加する
+作成したテーブルをデータベースに追加する

-書式
 catalog.Tables.Append table
 
 catalog  :開いているCatalogオブジェクト
 table    :作成したTableオブジェクト

***テーブルにフィールドを追加する [#q044c5c9]
テーブルには、必ず1つ以上のフィールドが必要です。~
TableオブジェクトのColumnsコレクションに、Appendメソッドを使ってColumnsオブジェクトを追加してください。

-書式
 table.Collections.Append column, type, definesize
 
 table      :開いているTableオブジェクト
 column     :フィールド名
 type       :データ型
             adVarWCar         :テキスト型
             adLongVarWChar    :メモ型
             adUnsignedTinyInt :数値型(バイト型)
             adSmallInt        :数値型(整数型)
             adInteger         :数値型(長整数型)
             adSingle          :数値型(単精度浮動小数点数型
             adDouble          :数値型(倍精度浮動小数点数型
             adGUID            :数値型(レプリケーションID型)
             adNumeric         :数値型(10進型)
             adDate            :日付/時刻
             adCurrency        :通貨型
             adInteger         :オートナンバー型
             adBoolean         :Yes/No型
             adLongVarBinary   :OLEオブジェクト型
             adLongVarWChar    :ハイパーテキスト型
 definesize :データサイズ(テキスト型のみ)

***データにインデックスを追加する [#yd1ec647]
+IndexオブジェクトのColumnsコレクションに、インデックスを設定するフィールドを追加する。
+TableオブジェクトのIndexesコレクションに、作成したIndexオブジェクトを追加する。

-インデックスにフィールドを追加する
-書式
 index.Columns.Append column
 
 index    :開いているIndexオブジェクト
 column   :フィールド名

-テーブルにインデックスを追加する。
-書式
 table.Indexes.Append index
 table    :開いているTableオブジェクト
 column   :インデックス名

-例
 id.Name = "PrimaryKey"   '-----------------インデックスの名前を設定
 id.PrimaryKey = True     '-----------------主キーを設定
 idx.Columns.Append "ID"  '-----------------[ID]フィールドにインデックスを設定
 table.Indexes.Append idx '-----------------作成したインデックスをテーブルに追加

**新規にテーブルを作成する。 [#y5866b99]
ADOXを使って新たにテーブルを作成するときは、ADOXの階層の低い方から順番にオブジェクトを作成し、コレクションに追加してください。

+TableオブジェクトのColumnsコレクションにColumnオブジェクトを追加
+IndexオブジェクトのColumnsコレクションにColumnオブジェクトを追加
+TableオブジェクトのIndexesコレクションにIndexオブジェクトを追加
+CatalogオブジェクトのTablesコレクションにTableオブジェクトを追加

-例
 Public Sub adoxMakeTable()
   Dim cat As New ADOX.Catalog
   Dim tb As New ADOX.Table
   Dim idx As New ADOX.Index
   
   cat.ActiveConnection = CurrentProject.Connection
   tb.Name = "T_電話帳"
   
   'テーブルにフィールドを追加
   tb.Columns.Append "ID", adInteger
   tb.Columns.Append "氏名", adVarWChar, 20
   tb.Columns.Append "生年月日", adDate
   tb.Columns.Append "電話番号", adVarWChar, 15
   
  'インデックス設定
   idx.Name = "PrimaryKey"               'インデックス名
   idx.PrimaryKey = True                 '主キー
   idx.Unique = True                     '固有
   idx.IndexNulls = adIndexNullsDisallow 'Null無視
   idx.Columns.Append "ID"
   
   'テーブルにインデックスを追加
   tb.Indexes.Append idx
   'データベースにテーブルを追加
   cat.Tables.Append tb
   
   '終了処理
   Set tb = Nothing: Set idx = Nothing: Set cat = Nothing
   Beep
   MsgBox "終了しました"
 End Sub

**新規にクエリを作成する [#o14b85a1]
+ADOのCommandオブジェクトを作成する
+CommandオブジェクトのCommandTextプロパティにSQLステートメントを設定する。
+作成したCommandオブジェクトをADOXのViewコレクションに追加する。

-書式
 catalog.Views.Append name, command
 
 catalog     :開いているCatalogオブジェクト
 name        :クエリ名
 command     :作成したCommandオブジェクト

-例~
[性別]フィールドの値が[「1」のレコードを抽出する「Q_男性」クエリを作成する
 Sub MyCreateQuery()
 
     Dim Cat As New ADOX.Catalog
     Dim Cmd As New ADODB.Command
     Dim mySQL As String
 
     Cat.ActiveConnection = CurrentProject.Connection
     mySQL = "SELECT * FROM T_顧客 WHERE 性別=1 "
 
     Cmd.CommandText = mySQL '
     Cat.Views.Append "Q_男性 ", Cmd
 
     Set Cat = Nothing
 End Sub

***パラメータクエリを作成する [#fadc1966]
Accessデータベースのパラメータクエリやアクションクエリも、これと同じ方法で作成する事ができます。~
Accessデータベースのクエリオブジェクトを作成するときは、下記のようにすると「パラメータの入力」ダイアログボックスが表示されるようになります。
 com.CommandText = "SELECT * FROM T_顧客 WHERE 性別 = 性別を入力"

**データベースを作成する [#a75004f4]
CatalogオブジェクトのCreateメソッドを利用すると、新規データベースを作成することができます。

-書式
 catalog.Create connectionstring
 
 catalog          :Catalogオブジェクト型のオブジェクト変数
 connectionstring :データベースの接続情報文字列

-例
 Public Sub adoxMakeDB()
   Dim cat As New ADOX.Catalog
   
   cat.Create "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Sample.mdb"
   
   Set cat = Nothing
 End Sub

**オブジェクトを削除する方法 [#tc08bf60]
データベースをからテーブルを削除する、テーブルからフィールドを削除する、テーブルからインデックスを削除する・・・~
これらは、みな、コレクションからオブジェクトを削除する処理です。コレクションのDeleteメソッドを利用します。

-書式
 collection.Delete object
 
 collection  :コレクション名
 object      :オブジェクト名

-例1~
[T_電話帳]テーブルを削除する。
 catalog.Tables.Delete "T_電話帳"

-例2~
[氏名]フィールドを削除する
 table.Column.Delete "氏名"

-例3
 Public Sub adoField()
   Dim cat As New ADOX.Catalog
   Dim tb As ADOX.Table
   
   cat.ActiveConnection = CurrentProject.Connection
   Set tb = cat.Tables!T_女性
   tb.Columns.Delete "郵便番号"
 End Sub