ADO.NETでODBCを経由してデータベースやテーブルのスキーマ情報を得る方法
ADO.NETでODBCを経由してデータベースやテーブルの定義情報を得る方法
覚書。
スキーマを取得して解析する。
System.Data.Odbc.OdbcConnection.Connection.GetSchema でデータベースのスキーマ情報が取得できる。
オープンすることが必要。
Dim connectionString As String = GetConnectionString() Using connection As New SqlConnection(connectionString) 'Connect to the database then retrieve the schema information. connection.Open() Dim table As DataTable = connection.GetSchema("Tables") End Using
取得できるスキーマ情報は以下のコレクションが全て連結して取得できる。
- 共通のスキーマコレクション(必須)
- 各種ドライバ別のスキーマコレクション(SQL Server,Oracle,ODBC,OleDb)
共通のスキーマコレクション
- MetaDataCollections
- DataSourceInformation
- DataTypes
の3つ。スキーマコレクションの前から3つ。
各スキーマコレクション毎に読み出せる情報項目は以下のページを参照。
共通のスキーマコレクション 詳細
ODBCドライバのスキーマコレクション
ODBC スキーマコレクション 詳細
上のページには SQLServer、Oracle、Jet の場合の取得可能スキーマとそれに含まれる情報項目の一覧がある。
これを読むとどの場合もスキーマの種類のレベルでは
- Tables
- Indexes
- Columns
- Procedures
- ProcedureColumns
- ProcedureParameters
- Views
の7種類が得られる様子。
でも実際に私がMySQLに対してODBCドライバ(3.51)に対してGetSchema(引数なし)してみたところ、上述のほかに
- Restrictions
- ReservedWords
も項目としては得られる。
用途、本当に信頼できる値が入っているのか不明。でも多分今回の私の用途では不要なのでこれで調査終わり。
通常は.GetSchema("Tables")といった引数ありで使うことの方が多いと思う。
.GetSchema("Tables")の結果
接続中のデータベースのテーブル定義情報がテーブル数分だけ取得できるが、ODBCドライバの場合その属性列が
TABLE_CAT/TABLE_SCHEM/TABLE_NAME/TABLE_TYPE/REMARKS
の5列で、比較するとSQL Server のODBCドライバの結果に近い。
だからSQL Server ODBCドライバの仕様に沿って解析すればよいのだろうか。