DataAdapter からの DataSet の読み込みPopulating a DataSet from a DataAdapter

ADO.NET DataSetは、データソースに依存しない一貫性のあるリレーショナルプログラミングモデルを提供する、メモリ常駐型のデータ表現です。The ADO.NET DataSet is a memory-resident representation of data that provides a consistent relational programming model independent of the data source. DataSet はテーブル、制約、およびテーブル間のリレーションシップを含む完全なデータのセットを表します。The DataSet represents a complete set of data that includes tables, constraints, and relationships among the tables. DataSet はデータ ソースとは独立しているため、 DataSet にはそのアプリケーションに固有のデータと複数のデータ ソースからのデータを含めることができます。Because the DataSet is independent of the data source, a DataSet can include data local to the application, and data from multiple data sources. 既存のデータ ソースとの対話は DataAdapterによって制御されます。Interaction with existing data sources is controlled through the DataAdapter.

SelectCommandDataAdapter プロパティは、データ ソースからデータを取得する Command オブジェクトです。The SelectCommand property of the DataAdapter is a Command object that retrieves data from the data source. InsertCommandUpdateCommandDeleteCommandDataAdapter の各プロパティは、 Command のデータに対して行われた変更に基づいてデータ ソースのデータ更新を管理する DataSetオブジェクトです。The InsertCommand, UpdateCommand, and DeleteCommand properties of the DataAdapter are Command objects that manage updates to the data in the data source according to modifications made to the data in the DataSet. これらのプロパティの詳細については、「 dataadapter を使用したデータソースの更新」を参照してください。These properties are covered in more detail in Updating Data Sources with DataAdapters.

FillDataAdapter メソッドは、 DataSetSelectCommand の結果を DataAdapterに設定するために使用します。The Fill method of the DataAdapter is used to populate a DataSet with the results of the SelectCommand of the DataAdapter. Fill は、その引数として、設定対象である DataSet と、 DataTable オブジェクト (つまり、 DataTable から返された行を格納する SelectCommandの名前) を受け取ります。Fill takes as its arguments a DataSet to be populated, and a DataTable object, or the name of the DataTable to be filled with the rows returned from the SelectCommand.

注意

DataAdapter を使用してテーブル全体を取得すると、特にテーブルの行数が多い場合は処理に時間がかかります。Using the DataAdapter to retrieve all of a table takes time, especially if there are many rows in the table. データベースにアクセスし、データを検索して処理した後、そのデータをクライアントに転送するという時間のかかる処理が伴うためです。This is because accessing the database, locating and processing the data, and then transferring the data to the client is time-consuming. また、テーブル全体をクライアントに取得しようとすると、サーバー上ですべての行がロックされます。Pulling all of the table to the client also locks all of the rows on the server. WHERE 句を使用して、クライアントから返される行数をできるだけ減らすことでパフォーマンスを向上させることができます。To improve performance, you can use the WHERE clause to greatly reduce the number of rows returned to the client. また、 SELECT ステートメントで必要な列を明示的に指定するだけでもクライアントに返されるデータ量を減らすことができます。You can also reduce the amount of data returned to the client by only explicitly listing required columns in the SELECT statement. それ以外の対策としては、一度に数百行など、行をバッチで取得し、クライアントが現在のバッチの処理を完了した時点で次のバッチを取得する方法も効果的です。Another good workaround is to retrieve the rows in batches (such as several hundred rows at a time) and only retrieve the next batch when the client is finished with the current batch.

Fill メソッドは、 DataReader オブジェクトを暗黙的に使用して DataSet内でテーブルを作成するための列の名前と型、および DataSet内のテーブルの行を設定するためのデータを返します。The Fill method uses the DataReader object implicitly to return the column names and types that are used to create the tables in the DataSet, and the data to populate the rows of the tables in the DataSet. テーブルおよび列は、存在しない場合にのみ作成されます。それ以外の場合、 Fill には、既存の DataSet スキーマが使用されます。Tables and columns are only created if they do not already exist; otherwise Fill uses the existing DataSet schema. 列の型は、 ADO.NET のデータ型マッピングのテーブルに従って .NET Framework 型として作成されます。Column types are created as .NET Framework types according to the tables in Data Type Mappings in ADO.NET. データ ソースに主キーが存在し、 DataAdapterによって制御されます。 MissingSchemaActionPrimary keys are not created unless they exist in the data source and DataAdapter.MissingSchemaAction MissingSchemaActionによって制御されます。 AddWithKeyによって制御されます。is set to MissingSchemaAction.AddWithKey. Fill はテーブルに主キーがあることがわかると、主キー列の値がデータ ソースから返された主キー列の値と一致する行について、データ ソースから返されたデータで DataSet 内のデータを上書きします。If Fill finds that a primary key exists for a table, it will overwrite data in the DataSet with data from the data source for rows where the primary key column values match those of the row returned from the data source. 主キーが見つからない場合は、 DataSetのテーブルの末尾にデータを追加します。If no primary key is found, the data is appended to the tables in the DataSet. Fillにデータを設定するときに存在する可能性DataSetがあるすべてのマッピングを使用します (「 DataAdapter DataTable」と「DataColumn mappings」を参照してください)。Fill uses any mappings that may exist when you populate the DataSet (see DataAdapter DataTable and DataColumn Mappings).

注意

SelectCommand が OUTER JOIN の結果を返す場合、 DataAdapter は、生成される PrimaryKeyDataTable値を設定しません。If the SelectCommand returns the results of an OUTER JOIN, the DataAdapter does not set a PrimaryKey value for the resulting DataTable. 自分で PrimaryKey を定義して、重複行が正しく解決されるようにする必要があります。You must define the PrimaryKey yourself to make sure that duplicate rows are resolved correctly. 詳細については、「主キーの定義」を参照してください。For more information, see Defining Primary Keys.

次のコード サンプルでは、Microsoft SQL Server の SqlDataAdapter データベースへの SqlConnection を使用する Northwind のインスタンスを作成し、 DataTable 内の DataSet に顧客リストを読み込みます。The following code example creates an instance of a SqlDataAdapter that uses a SqlConnection to the Microsoft SQL Server Northwind database and populates a DataTable in a DataSet with the list of customers. SqlConnection コンストラクターに渡される SQL ステートメントおよび SqlDataAdapter 引数は、 SelectCommandSqlDataAdapterプロパティを作成するために使用されます。The SQL statement and SqlConnection arguments passed to the SqlDataAdapter constructor are used to create the SelectCommand property of the SqlDataAdapter.

Example

' Assumes that connection is a valid SqlConnection object.  
Dim queryString As String = _  
  "SELECT CustomerID, CompanyName FROM dbo.Customers"  
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _  
  queryString, connection)  
  
Dim customers As DataSet = New DataSet  
adapter.Fill(customers, "Customers")  
// Assumes that connection is a valid SqlConnection object.  
string queryString =   
  "SELECT CustomerID, CompanyName FROM dbo.Customers";  
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);  
  
DataSet customers = new DataSet();  
adapter.Fill(customers, "Customers");  

注意

このサンプル コードでは、 Connectionの開始と終了を明示的に行っていません。The code shown in this example does not explicitly open and close the Connection. Fill メソッドは、接続がまだ開いていないことを認識すると Connection が使用している DataAdapter を暗黙的に開きます。The Fill method implicitly opens the Connection that the DataAdapter is using if it finds that the connection is not already open. Fill が接続を開いた場合は、 Fill の終了時に Fill が接続を終了します。If Fill opened the connection, it also closes the connection when Fill is finished. これにより、 FillUpdateなどの単一の操作を扱う場合にコードを簡略化できます。This can simplify your code when you deal with a single operation such as a Fill or an Update. これに対し、開いている接続を必要とする複数の操作を実行する場合は、 OpenConnectionメソッドを明示的に呼び出し、データ ソースに対する操作の実行後に CloseConnectionメソッドを呼び出すことでアプリケーションのパフォーマンスを改善できます。However, if you are performing multiple operations that require an open connection, you can improve the performance of your application by explicitly calling the Open method of the Connection, performing the operations against the data source, and then calling the Close method of the Connection. リソースを解放して他のクライアント アプリケーションが使用できるようにするために、データ ソースへの接続を開いたままにする時間は最小限にすることをお勧めします。You should try to keep connections to the data source open as briefly as possible to free resources for use by other client applications.

複数結果セットMultiple Result Sets

DataAdapter は複数の結果セットを検出すると、 DataSetに複数のテーブルを作成します。If the DataAdapter encounters multiple result sets, it creates multiple tables in the DataSet. これらのテーブルには、Table0 のように、"Table" で始まるインクリメンタル既定名 TableNが割り当てられます。The tables are given an incremental default name of TableN, starting with "Table" for Table0. テーブル名を引数として Fill メソッドに渡すと、TableName0 を表す "TableName" で始まるインクリメンタル既定名 TableNameNが割り当てられます。If a table name is passed as an argument to the Fill method, the tables are given an incremental default name of TableNameN, starting with "TableName" for TableName0.

複数の DataAdapter からの DataSet の読み込みPopulating a DataSet from Multiple DataAdapters

では、 DataAdapter DataSet任意の数のオブジェクトを使用できます。Any number of DataAdapter objects can be used with a DataSet. それぞれの DataAdapter で 1 つ以上の DataTable オブジェクトにデータを格納し、関連するデータ ソースに更新を反映させることができます。Each DataAdapter can be used to fill one or more DataTable objects and resolve updates back to the relevant data source. DataRelation に対して Constraint オブジェクトおよび DataSet オブジェクトを部分的に追加できるため、複数の異なるデータ ソースから取得したデータを関連付けることができます。DataRelation and Constraint objects can be added to the DataSet locally, which enables you to relate data from dissimilar data sources. たとえば、Microsoft SQL Server データベース、OLE DB を通じて公開される IBM DB2 データベース、および XML をストリーム転送するデータ ソースからのデータを DataSet に含めることができます。For example, a DataSet can contain data from a Microsoft SQL Server database, an IBM DB2 database exposed through OLE DB, and a data source that streams XML. 1 つ以上の DataAdapter オブジェクトを使用して、各データ ソースとの通信を行うことができます。One or more DataAdapter objects can handle communication to each data source.

Example

次のコード サンプルでは、Microsoft SQL Server 2000 の Northwind データベースおよび Microsoft Access の Northwind データベースから、それぞれ顧客リストと注文リストを取得します。The following code example populates a list of customers from the Northwind database on Microsoft SQL Server, and a list of orders from the Northwind database stored in Microsoft Access 2000. 取得したテーブルを DataRelationで関連付けて、顧客および対応する注文の一覧を表示します。The filled tables are related with a DataRelation, and the list of customers is then displayed with the orders for that customer. DataRelationオブジェクトの詳細については、「 datarelation の追加」および「 datarelation の移動」を参照してください。For more information about DataRelation objects, see Adding DataRelations and Navigating DataRelations.

' Assumes that customerConnection is a valid SqlConnection object.  
' Assumes that orderConnection is a valid OleDbConnection object.  
Dim custAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT * FROM dbo.Customers", customerConnection)  
  
Dim ordAdapter As OleDbDataAdapter = New OleDbDataAdapter( _  
  "SELECT * FROM Orders", orderConnection)  
  
Dim customerOrders As DataSet = New DataSet()  
custAdapter.Fill(customerOrders, "Customers")  
ordAdapter.Fill(customerOrders, "Orders")  
  
Dim relation As DataRelation = _  
  customerOrders.Relations.Add("CustOrders", _  
  customerOrders.Tables("Customers").Columns("CustomerID"), _   
  customerOrders.Tables("Orders").Columns("CustomerID"))  
  
Dim pRow, cRow As DataRow  
For Each pRow In customerOrders.Tables("Customers").Rows  
  Console.WriteLine(pRow("CustomerID").ToString())  
  
  For Each cRow In pRow.GetChildRows(relation)  
    Console.WriteLine(vbTab & cRow("OrderID").ToString())  
  Next  
Next  
// Assumes that customerConnection is a valid SqlConnection object.  
// Assumes that orderConnection is a valid OleDbConnection object.  
SqlDataAdapter custAdapter = new SqlDataAdapter(  
  "SELECT * FROM dbo.Customers", customerConnection);  
OleDbDataAdapter ordAdapter = new OleDbDataAdapter(  
  "SELECT * FROM Orders", orderConnection);  
  
DataSet customerOrders = new DataSet();  
  
custAdapter.Fill(customerOrders, "Customers");  
ordAdapter.Fill(customerOrders, "Orders");  
  
DataRelation relation = customerOrders.Relations.Add("CustOrders",  
  customerOrders.Tables["Customers"].Columns["CustomerID"],  
  customerOrders.Tables["Orders"].Columns["CustomerID"]);  
  
foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)  
{  
  Console.WriteLine(pRow["CustomerID"]);  
   foreach (DataRow cRow in pRow.GetChildRows(relation))  
    Console.WriteLine("\t" + cRow["OrderID"]);  
}  

SQL Server の 10 進数型SQL Server Decimal Type

既定では、 DataSetは .NET Framework データ型を使用してデータを格納します。By default, the DataSet stores data by using .NET Framework data types. ほとんどのアプリケーションで、これらのデータ型を使用してデータ ソース情報を簡単に表示できます。For most applications, these provide a convenient representation of data source information. しかし、データ ソースのデータ型が SQL Server の 10 進数データ型または数値データ型の場合は、この表現によって問題が生じる場合があります。However, this representation may cause a problem when the data type in the data source is a SQL Server decimal or numeric data type. .NET Framework decimalデータ型では最大28桁の有効桁数が許容されdecimalますが、SQL Server データ型では38の有効桁数が許容されます。The .NET Framework decimal data type allows a maximum of 28 significant digits, whereas the SQL Server decimal data type allows 38 significant digits. SqlDataAdapter が動作している間に、 Fill が、SQL Server の decimal フィールドの有効桁数が 28 文字を超えていると判断した場合、現在の行は DataTableに追加されません。If the SqlDataAdapter determines during a Fill operation that the precision of a SQL Server decimal field is larger than 28 characters, the current row is not added to the DataTable. その場合は FillError イベントが発生するため、開発者は有効桁数の消失が発生していないかどうかを確認し、適切に対応できます。Instead the FillError event occurs, which enables you to determine whether a loss of precision will occur, and respond appropriately. イベントのFillError詳細については、「 DataAdapter イベントの処理」を参照してください。For more information about the FillError event, see Handling DataAdapter Events. SQL Server の decimal 値を取得するために、 SqlDataReader オブジェクトを使用し、 GetSqlDecimal メソッドを呼び出すこともできます。To get the SQL Server decimal value, you can also use a SqlDataReader object and call the GetSqlDecimal method.

ADO.NET 2.0 では、のSystem.Data.SqlTypesの拡張DataSetサポートが導入されました。ADO.NET 2.0 introduced enhanced support for System.Data.SqlTypes in the DataSet. 詳細については、「 SqlTypes と DataSet」を参照してください。For more information, see SqlTypes and the DataSet.

OLE DB のチャプターOLE DB Chapters

階層構造の行セット、つまりチャプター (OLE DB では DBTYPE_HCHAPTER 型、ADO では adChapter 型) を使用して DataSet の内容を格納できます。Hierarchical rowsets, or chapters (OLE DB type DBTYPE_HCHAPTER, ADO type adChapter) can be used to fill the contents of a DataSet. OleDbDataAdapterFill が動作している間にチャプター列を検出すると、そのチャプター列のための DataTable を作成し、チャプターから取得した列と行をこのテーブルに格納します。When the OleDbDataAdapter encounters a chaptered column during a Fill operation, a DataTable is created for the chaptered column, and that table is filled with the columns and rows from the chapter. チャプター列用に作成されたテーブルには、親テーブルの名前とチャプター列の名前の両方を使用した "ParentTableNameChapteredColumnName" 形式の名前が割り当てられます。The table created for the chaptered column is named by using both the parent table name and the chaptered column name in the form "ParentTableNameChapteredColumnName". DataSet にチャプター列の名前と一致するテーブルが既に存在する場合は、現在のテーブルにチャプター データが格納されます。If a table already exists in the DataSet that matches the name of the chaptered column, the current table is filled with the chapter data. 既存のテーブルにチャプター内の列と一致する列が存在しない場合は、新しい列が追加されます。If there is no column in an existing table that matches a column found in the chapter, a new column is added.

DataSet 内のテーブルにチャプター列のデータを格納する前に、親テーブルと子テーブルの両方に 1 つの整数列を追加し、親列を自動インクリメントに設定し、両方のテーブルに追加された列を使用して DataRelation を作成すると、階層構造の行セットを形成している親テーブルと子テーブルの間にリレーションが作成されます。Before the tables in the DataSet are filled with the data in the chaptered columns, a relation is created between the parent and child tables of the hierarchical rowset by adding an integer column to both the parent and child table, setting the parent column to auto-increment, and creating a DataRelation using the added columns from both tables. 追加されたリレーションには親テーブルの名前とチャプター列の名前を使用した "ParentTableNameChapterColumnName" 形式の名前が割り当てられます。The added relation is named by using the parent table and chapter column names in the form "ParentTableNameChapterColumnName".

関連付けられた列は、 DataSetだけに存在します。Note that the related column only exists in the DataSet. そのデータ ソースからの次の Fill 操作を実行すると、変更を既存の行にマージするのではなく、テーブルに新しい行が追加されます。Subsequent fills from the data source can cause new rows to be added to the tables instead of changes being merged into existing rows.

DataAdapter.Fill を受け取る DataTableオーバーロードを使用した場合は、そのテーブルだけにデータが格納されます。Note also that, if you use the DataAdapter.Fill overload that takes a DataTable, only that table will be filled. 自動インクリメント整数列は、引き続きそのテーブルに追加されますが、子テーブルの作成、子テーブルへのデータの格納、およびリレーションの作成は行われません。An auto-incrementing integer column will still be added to the table, but no child table will be created or filled, and no relation will be created.

MSDataShape プロバイダーを使用して顧客リスト内の各顧客に対応するオーダー列を生成する例を次に示します。The following example uses the MSDataShape Provider to generate a chapter column of orders for each customer in a list of customers. チャプター列を生成した後で、1 つの DataSet 内にそのデータを格納します。A DataSet is then filled with the data.

Using connection As OleDbConnection = New OleDbConnection( _  
  "Provider=MSDataShape;Data Provider=SQLOLEDB;" & _  
  "Data Source=(local);Integrated " & _  
  "Security=SSPI;Initial Catalog=northwind")  
  
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter( _  
  "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " & _  
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " & _  
  "RELATE CustomerID TO CustomerID)", connection)  
  
Dim customers As DataSet = New DataSet()  
  
adapter.Fill(customers, "Customers")  
End Using  
using (OleDbConnection connection = new OleDbConnection("Provider=MSDataShape;Data Provider=SQLOLEDB;" +  
  "Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind"))  
{  
OleDbDataAdapter adapter = new OleDbDataAdapter("SHAPE {SELECT CustomerID, CompanyName FROM Customers} " +  
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " +  
  "RELATE CustomerID TO CustomerID)", connection);  
  
DataSet customers = new DataSet();  
adapter.Fill(customers, "Customers");  
}  

Fill 操作が完了すると、 DataSetCustomersCustomersOrdersの 2 つのテーブルが格納されます。 CustomersOrders はチャプター列を表します。When the Fill operation is complete, the DataSet contains two tables: Customers and CustomersOrders, where CustomersOrders represents the chaptered column. Orders という列が Customers テーブルに追加され、 CustomersOrders という列が CustomersOrders テーブルに追加されます。An additional column named Orders is added to the Customers table, and an additional column named CustomersOrders is added to the CustomersOrders table. Orders テーブルの Customers 列は、自動インクリメントに設定されます。The Orders column in the Customers table is set to auto-increment. 親テーブルである DataRelationテーブルに追加された列を使用して、 CustomersOrdersという Customers が作成されます。A DataRelation, CustomersOrders, is created by using the columns that were added to the tables with Customers as the parent table. サンプル結果の一部を次の表に示します。The following tables show some sample results.

テーブルCustomersTableName: Customers

CustomerIDCustomerID CompanyNameCompanyName OrdersOrders
ALFKIALFKI Alfreds FutterkisteAlfreds Futterkiste 00
ANATRANATR Ana Trujillo Emparedados y heladosAna Trujillo Emparedados y helados 11

テーブルCustomersOrdersTableName: CustomersOrders

CustomerIDCustomerID OrderIDOrderID CustomersOrdersCustomersOrders
ALFKIALFKI 1064310643 00
ALFKIALFKI 1069210692 00
ANATRANATR 1030810308 11
ANATRANATR 1062510625 11

関連項目See also