次の方法で共有


DbDataAdapter.FillSchema メソッド (DataSet, SchemaType, String)

指定した DataSetDataTable を追加し、指定した SchemaType および DataTable に基づいて、データ ソース内のスキーマと一致するようにスキーマを設定します。

Overloads Public Function FillSchema( _
   ByVal dataSet As DataSet, _   ByVal schemaType As SchemaType, _   ByVal srcTable As String _) As DataTable()
[C#]
public DataTable[] FillSchema(DataSetdataSet,SchemaTypeschemaType,stringsrcTable);
[C++]
public: DataTable* FillSchema(DataSet* dataSet,SchemaTypeschemaType,String* srcTable) [];
[JScript]
public function FillSchema(
   dataSet : DataSet,schemaType : SchemaType,srcTable : String) : DataTable[];

パラメータ

  • dataSet
    スキーマを挿入する DataSet
  • schemaType
    スキーマを挿入する方法を指定する SchemaType 値の 1 つ。
  • srcTable
    テーブル マップに使用するソース テーブルの名前。

戻り値

DataSet に追加された DataTable オブジェクトのコレクションへの参照。

例外

例外の種類 条件
ArgumentException スキーマの取得元のソース テーブルが見つかりませんでした。

解説

このメソッドは、 SelectCommand を使用して、データ ソースからスキーマ情報を取得します。

FillSchema は、指定された DataSetDataTable を追加します。次に、 DataTableDataColumnCollection に列を追加します。データ ソースに次の DataColumn プロパティが存在する場合は、それを設定します。

また、 FillSchema は、次の規則に従って、 PrimaryKey プロパティと Constraints プロパティも設定します。

  • SelectCommand によって 1 つ以上の主キー列が返された場合は、それを DataTable の主キー列として使用します。
  • 主キー列が返されず、一意の列が返された場合、それらの列すべてが null 値を許容しないときに限り、一意の列を主キーとして使用します。いずれかの列が null 値を許容するときは、 ConstraintCollectionUniqueConstraint を追加します。 PrimaryKey プロパティは設定しません。
  • 主キー列と一意の列の両方が返された場合は、主キー列を DataTable の主キー列として使用します。

主キーおよび UNIQUE 制約は上記の規則に従って ConstraintCollection に追加されますが、その他の種類の制約は追加されないことに注意してください。

主キー情報は、 Fill の実行時に、キー列が一致する行を検索および置換するために使用されます。この動作が不要な場合は、スキーマ情報を要求せずに Fill を使用してください。

DataTable へのデータの格納中に重複する列が見つかった場合、2 番目以降の列には、 DbDataAdapter によって、columnname1、columnname2、columnname3 のような形式で名前が生成されます。受信したデータに無名の列が含まれていた場合は、Column1、Column2 のような形式の名前で DataSet に列が格納されます。 DataSet に複数結果セットを追加するときは、各結果セットが個別のテーブルに格納されます。2 番目以降の結果セットには、指定されたテーブル名に整数値を追加した名前が付けられます。たとえば、Table、Table1、Table2 のようになります。アプリケーションで列名およびテーブル名を使用するときは、これらの形式の名前と衝突しないように注意する必要があります。

FillSchema メソッドは、大文字と小文字の違いを除いて名前が一致する DataTable オブジェクトが DataSet 内に複数含まれる場合に、それらを区別します。この場合、 FillSchema は、大文字と小文字を区別して比較を実行し、対応するテーブルを見つけます。正確に一致するテーブルが存在しない場合は、新しく作成します。この動作を表す C# コードの例を次に示します。

DataSet dataset = new DataSet();
dataset.Tables.Add("aaa");
dataset.Tables.Add("AAA");
adapter.FillSchema(dataset, "aaa"); // Fills the schema of "aaa", which already exists in the DataSet.
adapter.FillSchema(dataset, "Aaa"); // Adds a new table called "Aaa".

FillSchema を呼び出したときに、大文字と小文字の違いを除いて名前が一致する DataTableDataSet 内に 1 つだけ含まれている場合は、その DataTable が更新されます。この場合は、比較のときに大文字と小文字が区別されません。この動作を表す C# コードの例を次に示します。

DataSet dataset = new DataSet();
dataset.Tables.Add("aaa");
adapter.FillSchema(dataset, "AAA"); // Fills the schema of table "aaa" because only one similarly named table is in the DataSet.

SELECT コマンドに関連付けられた IDbConnection オブジェクトは、有効なものである必要がありますが、開いている必要はありません。 FillSchema を呼び出す前に IDbConnection が閉じていた場合は、接続が開かれ、データを取得した後で再び閉じられます。 FillSchema を呼び出す前に接続を開いていた場合は、接続は開いたままになります。

メモ   複数の結果を返すバッチ SQL ステートメントを処理する場合、.NET Framework Data Provider for OLE DB の FillSchema の実装では、最初の結果のスキーマ情報だけが取得されます。複数の結果のスキーマ情報を取得するには、 MissingSchemaActionAddWithKey に設定して Fill を使用します。

FillSchema を使用する場合、.NET Framework Data Provider for SQL Server は、実行するステートメントに FOR BROWSE 句を追加します。SET FMTONLY ON ステートメントの使用による干渉などの副作用に注意してください。詳細については、SQL Server Books Online を参照してください。

使用例

[Visual Basic, C#, C++] SqlDataAdapter 派生クラスを使用して、 DataSet にスキーマを格納し、 DataTable オブジェクトの配列にデータを格納してから、 SqlParameterCollection コレクションを IDataParameter オブジェクトの配列に戻す例を次に示します。この例では、 SqlDataAdapter および DataSet が作成されていることを前提にしています。

 
Public Shared Function GetCustomerData(dataSetName As String) As DataSet

  Dim ds As DataSet = New DataSet(dataSetName)

  Dim conn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind")

  Dim da As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName, ContactName FROM Customers", conn) 

  conn.Open()

  da.FillSchema(ds, SchemaType.Source, "Customers")

  da.Fill(ds)

  conn.Close()

  Return ds
End Function

[C#] 
public static DataSet GetCustomerData(string dataSetName)
{
  DataSet ds = new DataSet(dataSetName);

  SqlConnection conn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind");

  SqlDataAdapter da = new SqlDataAdapter("SELECT CustomerID, CompanyName, ContactName FROM Customers", conn); 

  conn.Open();

  da.FillSchema(ds, SchemaType.Source, "Customers");

  da.Fill(ds);

  conn.Close();

  return ds;
}

[C++] 
public:
  static DataSet* GetCustomerData(String* dataSetName)
  {
    DataSet* ds = new DataSet(dataSetName);

    SqlConnection* conn = new SqlConnection(S"Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind");

    SqlDataAdapter* da = new SqlDataAdapter(S"SELECT CustomerID, CompanyName, ContactName FROM Customers", conn); 

    conn->Open();

    da->FillSchema(ds, SchemaType::Source, S"Customers");

    da->Fill(ds);

    conn->Close();

    return ds;
  }

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

参照

DbDataAdapter クラス | DbDataAdapter メンバ | System.Data.Common 名前空間 | DbDataAdapter.FillSchema オーバーロードの一覧