GetOleDbSchemaTable と Visual C# .NET を使用してスキーマ情報を取得する方法

文書翻訳 文書翻訳
文書番号: 309681 - 対象製品
この記事は、以前は次の ID で公開されていました: JP309681
すべて展開する | すべて折りたたむ

目次

概要

この資料では、ADO.NET にある OleDbConnection オブジェクトの GetOleDbSchemaTable メソッドを使用して、データベースのスキーマ情報を取得する方法について説明します。データ ソースのスキーマ情報には、そのデータ ソースで利用可能なデータベースやカタログ、データベース内のテーブルやビュー、制約などが含まれます。テーブルのスキーマ情報には、主キー、列、および "オートナンバ" フィールドが含まれます。

SqlClient.SqlConnection オブジェクトを使用する場合は、GetOleDbSchemaTable メソッドと等価なメソッドがないことに注意してください。SQL Server .NET データ プロバイダでは、ストアド プロシージャと情報用のビューを使用して、バックエンドのスキーマ情報を公開します。Microsoft SQL Server を介して使用できるビューやストアド プロシージャの詳細については、MSDN ライブラリの Transact-SQL リファレンスを参照してください。

必要条件

必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack は次のとおりです。
  • Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、Windows NT 4.0 Server のいずれか
  • Microsoft Visual Studio .NET
この資料は、次のトピックについて詳しい知識のあるユーザーを対象としています。
  • Visual Studio .NET
  • ADO.NET の基本および構文

OleDbConnection オブジェクトの GetOleDbSchemaTable メソッド

OLE DB .NET データ プロバイダは、OleDbConnection オブジェクトの GetOleDbSchemaTable メソッドを使用して、スキーマ情報を公開します。GetOleDbSchemaTable からは、スキーマ情報が設定された DataTable が返されます。

GetOleDbSchemaTable メソッドの最初の引数はスキーマのパラメータで、どのスキーマ情報 (テーブル、列、主キーなど) が返されるのかを指定する OleDbSchemaGuid 型の引数です。2 番目の引数は、スキーマの DataTable に返される行をフィルタするための制約の Object 型配列です (たとえば、テーブル名、型、所有者、およびスキーマの制約を指定できます)。

OleDbSchemaGuid のメンバ

OleDbSchemaGuid 引数は、GetOleDbSchemaTable メソッドに対してスキーマ テーブルの種類を指定するものです。OleDbSchemaGuid のメンバの一部を次に示します。
  • Columns
  • Foreign keys
  • Indexes
  • Primary keys
  • Tables
  • Views
OleDbSchemaGuid の全メンバの一覧については、「関連情報」の Web サイト「OleDbSchemaGuid メンバ」を参照してください。

制約

制約は、フィルタの値を設定した Object 配列で、各要素は返される DataTable の DataColumn に対応しています。OleDbSchemaGuid 引数によって、関連する制約が決まります。たとえば、テーブルの OleDbSchemaGuid を指定した場合、制約の配列は次のようになります。
{TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE}
利用可能な制約を調べるには、次のマイクロソフト Web サイトで、OleDbSchemaGuid のメンバをクリックしてください。
OleDbSchemaGuid メンバ
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledboledbschemaguidmemberstopic.asp
制約配列に値を渡す場合、値を含まない配列要素には Visual C# .NET の null キーワードを含めるようにしてください。たとえば、テーブル スキーマを取得する場合は OleDbSchemaGuid.Tables を使用します。ただし、テーブル (Tables) を指定すると、別名、シノニム、ビュー、およびその他の関係するオブジェクトも返されます。このため、テーブル以外のオブジェクトをすべて除外する場合は、TABLE_TYPE に TABLE の制約を指定します。TABLE_CATALOG、TABLE_SCHEMA、および TABLE_NAME に対応するオブジェクトにはフィルタリングを行わないため、これらには null を使用できます。
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
              new Object[] {null, null, null, "TABLE"});
				

返される DataTable

GetOleDbSchemaTable メソッドが返す DataTable には、OleDbSchemaGuid の型と制約条件に一致した各オブジェクトに対応した行が含まれています。DataTable には制約列ごとに対応した一連の列があり、この後に OleDbSchemaGuid に基づく追加のスキーマ情報が続きます。

たとえば、次のコードを使用すると、返される DataTable の各行はデータベース テーブルになります。
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
              new Object[] {null, null, null, "TABLE"});
				
DataTable に返される列は、制約の列 (TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、TABLE_TYPE) です。この後に、追加のスキーマ列として TABLE_GUID、DESCRIPTION、TABLE_PROPID、DATE_CREATED、および DATE_MODIFIED が続きます。

この列名の一覧 (つまり、TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME などのフィールド記述子) は、列の順序位置 (インデックス) を使用して取得できます。Columns 配列はインデックスがゼロから始まることに注意してください。
for (int i = 0; i < schemaTable.Columns.Count; i++) {
   Console.WriteLine(schemaTable.Columns[i].ToString());
}
				
各列の値 (つまり、Categories、Customers、Employees など実際のテーブル名) を取得するには、行の ItemArray の順序位置 (インデックス) を使用します。ItemArray はインデックスがゼロから始まることに注意してください。
for (int i = 0; i < schemaTable.Rows.Count; i++) {
   Console.WriteLine(schemaTable.Rows[i].ItemArray[2].ToString());
}
				

データベースのテーブルを一覧表示するサンプルを作成する

次のサンプルは、SQL Server の Northwind データベースのテーブルを一覧表示するものです。

OleDbSchemaGuid.Tables は、指定されたログオン ユーザーがアクセスできるテーブル (ビューを含む) を返します。Object 配列 {null, null, null, "TABLE"} を指定すると、TABLE_TYPE が TABLE であるデータのみが含まれるようにフィルタされます。その後、返されたスキーマ テーブルの各行のテーブル名 (TABLE_NAME) を一覧表示します。
  1. Visual Studio .NET を起動します。
  2. Visual C# のコンソール アプリケーション プロジェクトを新規作成します。デフォルトで Class1.cs がプロジェクトに追加されます。
  3. コード ウィンドウで Class1 を開きます。次のコードをコード ウィンドウの最上部にある namespace 宣言の直前に貼り付けます。
    using System.Data;
    using System.Data.OleDb;
    					
  4. コード ウィンドウで、次のコードを Main 関数に貼り付けます。
    OleDbConnection cn = new OleDbConnection();
    DataTable schemaTable;
    
    //Connect to the Northwind database in SQL Server.
    //Be sure to use an account that has permission to list tables.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;
                           Password=<strong password>;Initial Catalog=Northwind";
    cn.Open();
    
    //Retrieve schema information about tables.
    //Because tables include tables, views, and other objects,
    //restrict to just TABLE in the Object array of restrictions.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
                  new Object[] {null, null, null, "TABLE"});
    
    //List the table name from each row in the schema table.
    for (int i = 0; i < schemaTable.Rows.Count; i++) {
       Console.WriteLine(schemaTable.Rows[i].ItemArray[2].ToString());
    }
    
    //Explicitly close - don't wait on garbage collection.
    cn.Close();
    
    //Pause
    Console.ReadLine();
    					
  5. Northwind データベースのテーブルを一覧表示するためのアクセス許可のあるアカウントで SQL Server を実行するコンピュータに接続できるように、ConnectionString を修正します。
  6. F5 キーを押して、プロジェクトをコンパイルおよび実行します。コンソール ウィンドウにテーブルが一覧表示されることを確認してください。
  7. Enter キーを押してコンソール アプリケーションを終了し、統合開発環境 (IDE) に戻ります。

テーブルのスキーマを取得するサンプルを作成する

次のサンプルは、SQL Server の Northwind データベースにある Employees テーブルのスキーマ情報を一覧表示するものです。

OleDbSchemaGuid.Tables は、指定されたログオン ユーザーがアクセスできるテーブル (ビューを含む) を返します。Object 配列 {null, null, "Employees", "TABLE"} を指定した場合、Employees という名前のテーブルのみが含まれるようにフィルタされます。その後、返されたスキーマ テーブルのスキーマ情報を一覧表示します。
  1. Visual C# のコンソール アプリケーション プロジェクトを新規作成します。デフォルトで Class1.cs がプロジェクトに追加されます。
  2. コード ウィンドウで Class1 を開きます。次のコードをコード ウィンドウの最上部にある namespace 宣言の直前に貼り付けます。
    using System.Data;
    using System.Data.OleDb;
    					
  3. コード ウィンドウで、次のコードを Main 関数に貼り付けます。
    OleDbConnection cn = new OleDbConnection();
    DataTable schemaTable;
    
    //Connect to the Northwind database in SQL Server.
    //Be sure to use an account that has permission to retrieve table schema.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;
                          Password=<strong password>;Initial Catalog=Northwind";
    cn.Open();
    
    //Retrieve schema information about the Employees table.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
                  new Object[] {null, null, "Employees", "TABLE"});
    
    //List the schema info for the Employees table
    //in the format Field Descriptor : Field Value.
    for(int i = 0; i < schemaTable.Columns.Count; i++) {
       Console.WriteLine(schemaTable.Columns[i].ToString() + " : " + 
                         schemaTable.Rows[0][i].ToString());
    }
    
    //Explicitly close - don't wait on garbage collection.
    cn.Close();
    
    //Pause
    Console.ReadLine();
    					
  4. Employees テーブル スキーマを取得するアクセス許可のあるアカウントで SQL Server を実行するコンピュータに接続できるように、ConnectionString を修正します。
  5. F5 キーを押してプロジェクトをコンパイルおよび実行します。テーブルがコンソール ウィンドウに一覧表示されることを確認してください。
  6. Enter キーを押してコンソール アプリケーションを終了し、IDE に戻ります。

データベースの列を一覧表示するサンプルを作成する

次のサンプルは、SQL Server の Northwind データベースにある Employees テーブルの列の名前を一覧表示するものです。

OleDbSchemaGuid.Columns は、指定されたログオン ユーザーがアクセスできるテーブルとビューの列を返します。Object 配列 {null, null, "Employees", null} を指定した場合、Employees テーブルの列のみが含まれるようにフィルタされます。
  1. Visual C# のコンソール アプリケーション プロジェクトを新規作成します。デフォルトで Class1.cs がプロジェクトに追加されます。
  2. コード ウィンドウで Class1 を開きます。次のコードをコード ウィンドウの最上部にある namespace 宣言の直前に貼り付けます。
    using System.Data;
    using System.Data.OleDb;
    					
  3. コード ウィンドウで、次のコードを Main 関数に貼り付けます。
    OleDbConnection cn = new OleDbConnection();
    DataTable schemaTable;
    
    //Connect to the Northwind database in SQL Server.
    //Be sure to use an account that has permission to list the columns in the Employees table.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;
                           Password=<strong password>;Initial Catalog=Northwind";
    cn.Open();
    
    //Retrieve schema information about columns.
    //Restrict to just the Employees TABLE.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, 
                  new Object[] {null, null, "Employees", null});
    
    //List the column name from each row in the schema table.
    for (int i = 0; i < schemaTable.Rows.Count; i++) {
       Console.WriteLine(schemaTable.Rows[i].ItemArray[3].ToString());
    }
    
    //Explicitly close - don't wait on garbage collection.
    cn.Close();
    
    //Pause
    Console.ReadLine();
    					
  4. Employees テーブルの列を一覧表示するためのアクセス許可のあるアカウントで SQL Server を実行するコンピュータに接続できるように、ConnectionString を修正します。
  5. F5 キーを押してプロジェクトをコンパイルおよび実行します。Employees テーブルの列がコンソール ウィンドウに一覧表示されることを確認してください。
  6. Enter キーを押してコンソール アプリケーションを終了し、IDE に戻ります。

テーブルの主キーを一覧表示するサンプルを作成する

次のサンプルは、SQL Server の Northwind データベースにある Employees テーブル、および SQL Server Pubs データベースの Employee テーブルの主キーを一覧表示するものです。

OleDbSchemaGuid.Primary_Keys は、指定されたログオン ユーザーがアクセスできるカタログの主キーを返します。このサンプルでは、OleDbConnection は、特定の SQL Server データベースではなく、SQL Server に接続します。
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;
                       Password=<strong password>;"
				
OleDbConnection で指定する代わりに、このコードでは、制約配列の TABLE_CATALOG として Northwind または Pubs データベースを指定します。このコードは、TABLE_SCHEMA 制約に対して、テーブルの所有者 "dbo" を指定します。さらに、このコードは、TABLE_NAME 制約でテーブル名を指定します。

Northwind データベースの Employees テーブルの主キーを取得するには、Object 配列 {"Northwind", "dbo", "Employees"} を使用します。
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, 
              new Object[] {"Northwind", "dbo", "Employees"});
				
Pubs データベースの Employee テーブルの主キーを取得するには、Object 配列 {"Pubs", "dbo", "Employee"} を使用します。
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, 
              new Object[] {"Pubs", "dbo", "Employee"});
				
サンプルを作成するには、次の手順を実行します。
  1. Visual C# のコンソール アプリケーション プロジェクトを新規作成します。デフォルトで Class1.cs がプロジェクトに追加されます。
  2. コード ウィンドウで Class1 を開きます。次のコードをコード ウィンドウの最上部にある namespace 宣言の直前に貼り付けます。
    using System.Data;
    using System.Data.OleDb;
    					
  3. コード ウィンドウで、次のコードを Main 関数に貼り付けます。
    OleDbConnection cn = new OleDbConnection();
    DataTable schemaTable;
    
    //Connect to SQL Server.
    //Be sure to use an account that has permissions to list primary keys
    //in both the Northwind and Pubs databases.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;
                           Password=<strong password>;";
    cn.Open();
    
    //Retrieve schema information about primary keys.
    //Restrict to just the Employees TABLE in the Northwind CATALOG.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, 
                  new Object[] {"Northwind", "dbo", "Employees"});
    
    //List the primary key for the first row in the schema table.
    //The first three items in the ItemArray in the row are catalog, schema, and table.
    //The fourth item is the primary key.
    Console.WriteLine(schemaTable.Rows[0].ItemArray[3].ToString());
    
    //Retrieve primary key for the Employee TABLE in the Pubs CATALOG.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, 
                  new Object[] {"Pubs", "dbo", "Employee"});
    
    //List the primary key for the first row in the schema table.
    Console.WriteLine(schemaTable.Rows[0].ItemArray[3].ToString());
    
    //Explicitly close - don't wait on garbage collection.
    cn.Close();
    
    //Pause
    Console.ReadLine();
    					
  4. 主キーの一覧を表示するために必要なアクセス許可のあるアカウントで SQL Server を実行するコンピュータに接続できるように、ConnectionString を修正します。
  5. F5 キーを押してプロジェクトをコンパイルおよび実行します。Northwind データベースの Employees テーブル、および Pubs データベースの Employee テーブルが、コンソール ウィンドウに表示されることを確認してください。
  6. Enter キーを押してコンソール アプリケーションを終了し、IDE に戻ります。

関連情報

OleDbSchemaGuid の全メンバの一覧については、Microsoft .NET Framework Software Development Kit (SDK) で次のトピックを参照してください。利用可能な制約の一覧については、OleDbSchemaGuid メンバのいずれかをクリックしてください。
OleDbSchemaGuid メンバ
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledboledbschemaguidmemberstopic.asp
詳細については、.NET Framework SDK ドキュメントで次のトピックを参照してください。
データベースからのスキーマ情報の取得
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconobtainingschemainformationfromdatabase.asp

OleDbConnection.GetOleDbSchemaTable メソッド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledboledbconnectionclassgetoledbschematabletopic.asp

OleDbSchemaGuid.Tables フィールド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledboledbschemaguidclasstablestopic.asp

OleDbSchemaGuid.Columns フィールド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledboledbschemaguidclasscolumnstopic.asp

OleDbSchemaGuid.Primary_Keys フィールド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataoledboledbschemaguidclassprimary_keystopic.asp

プロパティ

文書番号: 309681 - 最終更新日: 2005年12月19日 - リビジョン: 3.2
この資料は以下の製品について記述したものです。
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
キーワード:?
kbhowtomaster kbsystemdata KB309681
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com