指定したテーブルの定義情報を取得

解決


うだい  2004-12-14 16:54:56  No: 87362  IP: [192.*.*.*]

環境は「VB6.0(SP5) + Access 2000(SP3)」です。ADOでMDBに接続しています。
ADO(2.5 Library)で、指定したテーブルの定義情報を取得したいのですが、どのようにすれば取得できるのでしょうか?
ADOX.Catalogを使用して、テーブル定義一覧は取得できるということは、わかったのですが、指定したテーブルの取得方法がわかりません。
以上、よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-12-14 18:19:24  No: 87363  IP: [192.*.*.*]

> 指定したテーブルの定義情報を取得したいのですが
ADOXを使わず、ADODBだけでも取得できますよ。
ConnectionオブジェクトのOpenSchemaメソッドですね。

> 指定したテーブルの取得方法がわかりません。
テーブルの何を取得したいのでしょうか?

テーブルを「ADOX.Tableオブジェクト」として取得したいと言う意味なら、
CatalogオブジェクトのTablesプロパティが使えるかと。

編集 削除
うだい  2004-12-15 10:05:35  No: 87364  IP: [192.*.*.*]

>テーブルの何を取得したいのでしょうか?
ほしい情報は[カラム名]とその情報・・・
・プライマリキーであるか
・Nullを許可するか
・属性(文字列/数値)
・整数桁数
・少数桁数

Oracleでの、
「SELECT * FROM user_ind_columns」と
「SELECT * FROM user_tab_columns」といった情報がほしいのです。

現在、以下のようにして、情報を取得しようとしていますが、Valueで取得ができないようです。

Dim con As New ADODB.Connection
Dim rec As New ADODB.Recordset

Set rec = con.OpenSchema(adSchemaColumns, Array(Empty, Empty, "Aテーブル", "TABLE"))

For i = 0 To rec.fields.count -1
    Debug.Print rec.fields(i).Name
    Debug.Print rec.fields(i).value
Next i

指定(Aテーブル)はあるのですが、取得ができていません。見ているプロパティがおかしいのでしょうか?

編集 削除
魔界の仮面弁士  2004-12-15 11:31:25  No: 87365  IP: [192.*.*.*]

> Dim rec As New ADODB.Recordset
あれ? 何故ここで、New が使われているのでしょうか?

> For i = 0 To rec.fields.count -1
その前に、EOFの確認をしないと。

> Set rec = con.OpenSchema(adSchemaColumns, Array(Empty, Empty, "Aテーブル", "TABLE"))
> 指定(Aテーブル)はあるのですが、取得ができていません。
[Aテーブル]に、[TABLE]という列が無いのでは?

とりあえず、条件指定は後にして、全件取得から始めてみては如何でしょう。
デバッグ段階では、DataGridに表示させると簡単に確認できますよ。

    Set con = New ADODB.Connection
    con.Provider = "Microsoft.Jet.OLEDB.4.0"
    con.CursorLocation = adUseClient
    con.Open "BIBLIO.MDB"   'VB添付のmdbファイル

    Set Me.DataGrid1.DataSource = con.OpenSchema(adSchemaColumns)

編集 削除
うだい  2004-12-15 16:51:32  No: 87366  IP: [192.*.*.*]

指摘、アドバイス、ありがとうございます。

DataGridに表示したら、よくわかりました!
OpenSchemaメソッドのArray(〜)では、Field.Nameの指定を前から順に行っていたんですね。大変わかりやすかったです。

現時点で、プライマリキーの情報がどの項目なのかがどれかがちょっとわかりませんが、
それ以外のテーブル情報は取得できました。
属性をあらわす「DATA_TYPE」が数値で返ってくるようですが、これは定数で定義されているのでしょうか?(vbNo = 7であるように)

編集 削除
魔界の仮面弁士  2004-12-15 21:09:25  No: 87367  IP: [192.*.*.*]

MDAC SDKを見てください…。(^_^;)
(adSchemaColumnsの仕様等について、調査されていますか?)


> プライマリキーの情報がどの項目なのかがどれかがちょっとわかりませんが
adSchemaColumnsで取得できるのは、列のスキーマです。
インデックスのスキーマが必要であれば、adSchemaIndexes が利用できます。


> 「DATA_TYPE」が数値で返ってくるようですが、これは定数で定義されているのでしょうか
列挙定数としては、ADODB.DataTypeEnumが該当します。

編集 削除
うだい  2004-12-16 09:27:27  No: 87368  IP: [192.*.*.*]

重ね重ね、ありがとうございます。
MDAC SDKに書いてあったようで、失礼しました。
検索の仕方が悪かったようですが、そこで調べればよかったのですね。

おかげさまで、問題は解決できました。

編集 削除