ADO.NETでODBCを経由してデータベースやテーブルのスキーマ情報を得る方法

ADO.NETODBCを経由してデータベースやテーブルの定義情報を得る方法

覚書。

スキーマを取得して解析する。

MicrosoftのMSDNのページ

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

取得できるスキーマ情報は以下のコレクションが全て連結して取得できる。

  1. 共通のスキーマコレクション(必須)
  2. 各種ドライバ別のスキーマコレクション(SQL Server,Oracle,ODBC,OleDb)

共通のスキーマコレクション

  1. MetaDataCollections
  2. DataSourceInformation
  3. DataTypes

の3つ。スキーマコレクションの前から3つ。
スキーマコレクション毎に読み出せる情報項目は以下のページを参照。
共通のスキーマコレクション 詳細

ODBCドライバのスキーマコレクション

ODBC スキーマコレクション 詳細
上のページには SQLServerOracle、Jet の場合の取得可能スキーマとそれに含まれる情報項目の一覧がある。
これを読むとどの場合もスキーマの種類のレベルでは

  1. Tables
  2. Indexes
  3. Columns
  4. Procedures
  5. ProcedureColumns
  6. ProcedureParameters
  7. Views

の7種類が得られる様子。
でも実際に私がMySQLに対してODBCドライバ(3.51)に対してGetSchema(引数なし)してみたところ、上述のほかに

  1. Restrictions
  2. ReservedWords

も項目としては得られる。
用途、本当に信頼できる値が入っているのか不明。でも多分今回の私の用途では不要なのでこれで調査終わり。

通常は.GetSchema("Tables")といった引数ありで使うことの方が多いと思う。

.GetSchema("Tables")の結果

接続中のデータベースのテーブル定義情報がテーブル数分だけ取得できるが、ODBCドライバの場合その属性列が

TABLE_CAT/TABLE_SCHEM/TABLE_NAME/TABLE_TYPE/REMARKS

の5列で、比較するとSQL ServerODBCドライバの結果に近い。
だからSQL Server ODBCドライバの仕様に沿って解析すればよいのだろうか。