Auffüllen eines "DataSets" durch einen "DataAdapter"Populating a DataSet from a DataAdapter

Das ADO.NETADO.NET von DataSet ist eine speicherresidente Datendarstellung, die ein konsistentes relationales und von der Datenquelle unabhängiges Programmiermodell bereitstellt.The ADO.NETADO.NETDataSet is a memory-resident representation of data that provides a consistent relational programming model independent of the data source. Das DataSet stellt eine vollständige Datengruppe einschließlich Tabellen, Einschränkungen und Beziehungen zwischen Tabellen dar.The DataSet represents a complete set of data that includes tables, constraints, and relationships among the tables. Da das DataSet von der Datenquelle unabhängig ist, kann ein DataSet sowohl lokale Daten einer Anwendung als auch Daten aus mehreren Datenquellen enthalten.Because the DataSet is independent of the data source, a DataSet can include data local to the application, and data from multiple data sources. Die Interaktion mit vorhandenen Datenquellen wird über den DataAdaptergesteuert.Interaction with existing data sources is controlled through the DataAdapter.

Die SelectCommand -Eigenschaft des DataAdapter ist ein Command -Objekt, das Daten aus der Datenquelle abruft.The SelectCommand property of the DataAdapter is a Command object that retrieves data from the data source. Die InsertCommand-Eigenschaft, die UpdateCommand-Eigenschaft und die DeleteCommand -Eigenschaft des DataAdapter sind Command -Objekte, die Updates an den Daten in der Datenquelle entsprechend den Modifikationen an den Daten im DataSetverwalten.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. Diese Eigenschaften werden in ausführlicher behandelt Aktualisieren von Datenquellen mit "DataAdapters".These properties are covered in more detail in Updating Data Sources with DataAdapters.

Mithilfe der Fill -Methode des DataAdapter wird ein DataSet mit den Ergebnissen vom SelectCommand des DataAdapteraufgefüllt.The Fill method of the DataAdapter is used to populate a DataSet with the results of the SelectCommand of the DataAdapter. Fill verwendet als Argumente ein aufzufüllendes DataSet sowie ein DataTable -Objekt bzw. den Namen der DataTable , die mit den Zeilen gefüllt werden soll, die vom SelectCommandzurückgegeben werden.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.

Hinweis

Die Verwendung des DataAdapter zum Abrufen einer gesamten Tabelle kann einige Zeit in Anspruch nehmen, insbesondere, wenn die Tabelle viele Zeilen enthält.Using the DataAdapter to retrieve all of a table takes time, especially if there are many rows in the table. Der Grund hierfür ist, dass das Zugreifen auf die Datenbank und das Auffinden, Verarbeiten und Übertragen der Daten an den Client zeitaufwändig ist.This is because accessing the database, locating and processing the data, and then transferring the data to the client is time-consuming. Durch das Abrufen der gesamten Tabelle seitens des Clients werden außerdem alle ihre Zeilen auf dem Server gesperrt.Pulling all of the table to the client also locks all of the rows on the server. Zur Verbesserung der Leistung können Sie die WHERE -Klausel verwenden, um die Anzahl der an den Client zurückgegebenen Zeilen deutlich zu reduzieren.To improve performance, you can use the WHERE clause to greatly reduce the number of rows returned to the client. Die Anzahl der an den Client zurückgegebenen Daten kann auch verringert werden, indem Sie in der SELECT -Anweisung nur die erforderlichen Spalten explizit auflisten.You can also reduce the amount of data returned to the client by only explicitly listing required columns in the SELECT statement. Eine weitere gute Möglichkeit, dieses Problem zu umgehen, besteht darin, die Zeilen in Stapeln (z. B. immer einige hundert Zeilen auf einmal) abzurufen, wobei der nächste Stapel erst dann abgerufen wird, wenn der Client mit dem aktuellen Stapel fertig ist.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.

Die Fill -Methode verwendet das DataReader -Objekt implizit, um die Spaltennamen und Spaltentypen zurückzugeben, mit denen die Tabellen im DataSeterstellt werden, sowie die Daten zum Füllen der Tabellenzeilen im 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. Tabellen und Spalten werden nur erstellt, wenn sie noch nicht vorhanden sind. Andernfalls verwendet die Fill -Methode das vorhandene DataSet -Schema.Tables and columns are only created if they do not already exist; otherwise Fill uses the existing DataSet schema. Spaltentypen werden als erstellt .NET Framework.NET Framework Typen entsprechend den Tabellen in Datentypzuordnungen in ADO.NET.Column types are created as .NET Framework.NET Framework types according to the tables in Data Type Mappings in ADO.NET. Primärschlüssel werden nur erstellt, wenn diese in der Datenquelle vorhanden sind und DataAdaptergesteuert.MissingSchemaActionPrimary keys are not created unless they exist in the data source and DataAdapter.MissingSchemaAction auf MissingSchemaActiongesteuert.AddWithKeygesteuert.is set to MissingSchemaAction.AddWithKey. Wenn die Fill -Methode ermittelt, dass ein Primärschlüssel für eine Tabelle vorhanden ist, werden Daten im DataSet mit den Daten aus der Datenquelle überschrieben. Dies gilt für Zeilen, deren Werte in der Primärschlüsselspalte mit denen der Zeile übereinstimmen, die von der Datenquelle zurückgegeben wurde.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. Wurde kein Primärschlüssel gefunden, so werden die Daten an die Tabellen im DataSetangehängt.If no primary key is found, the data is appended to the tables in the DataSet. Fill verwendet Zuordnungen, die möglicherweise, beim Auffüllen bestehen der DataSet (finden Sie unter DataAdapter DataTable- und DataColumn-Zuordnungen).Fill uses any mappings that may exist when you populate the DataSet (see DataAdapter DataTable and DataColumn Mappings).

Hinweis

Wenn vom SelectCommand die Ergebnisse eines OUTER JOIN zurückgegeben werden, wird vom DataAdapter kein PrimaryKey -Wert für die resultierende DataTablefestgelegt.If the SelectCommand returns the results of an OUTER JOIN, the DataAdapter does not set a PrimaryKey value for the resulting DataTable. Sie müssen den PrimaryKey selbst definieren, um sicherzustellen, dass doppelte Zeilen ordnungsgemäß aufgelöst werden.You must define the PrimaryKey yourself to make sure that duplicate rows are resolved correctly. Weitere Informationen finden Sie unter Definieren von Primärschlüsseln.For more information, see Defining Primary Keys.

Im folgenden Codebeispiel wird eine Instanz eines SqlDataAdapter erstellt, die eine SqlConnection zur Microsoft SQL Server-Datenbank Northwind verwendet und eine DataTable in einem DataSet mit der Kundenliste füllt.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. Mit der SQL-Anweisung und den SqlConnection -Argumenten, die an den SqlDataAdapter -Konstruktor übergeben werden, wird die SelectCommand -Eigenschaft des SqlDataAdaptererstellt.The SQL statement and SqlConnection arguments passed to the SqlDataAdapter constructor are used to create the SelectCommand property of the SqlDataAdapter.

BeispielExample

' 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");  

Hinweis

Der in diesem Beispiel dargestellte Code öffnet und schließt die Connectionnicht explizit.The code shown in this example does not explicitly open and close the Connection. Die Fill -Methode öffnet implizit die Connection , die vom DataAdapter verwendet wird, wenn die Verbindung nicht bereits geöffnet ist.The Fill method implicitly opens the Connection that the DataAdapter is using if it finds that the connection is not already open. Wenn die Verbindung durch Fill geöffnet wurde, wird sie nach dem Fill -Vorgang auch wieder geschlossen.If Fill opened the connection, it also closes the connection when Fill is finished. Bei einzelnen Vorgängen wie Fill oder Updatekann der Code auf diese Weise vereinfacht werden.This can simplify your code when you deal with a single operation such as a Fill or an Update. Wenn Sie jedoch mehrere Vorgänge durchführen, für die eine geöffnete Verbindung erforderlich ist, können Sie die Leistung der Anwendung verbessern, indem Sie explizit die Open -Methode der Connectionaufrufen, die Vorgänge für die Datenquelle durchführen und anschließend die Close -Methode der Connectionaufrufen.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. Sie sollten die Verbindungen zur Datenquelle so kurz wie möglich geöffnet lassen, um die Ressourcen freizugeben, die von anderen Clientanwendungen verwendet werden.You should try to keep connections to the data source open as briefly as possible to free resources for use by other client applications.

Mehrere ResultsetsMultiple Result Sets

Wenn der DataAdapter mehrere Resultsets ermittelt, werden mehrere Tabellen im DataSeterstellt.If the DataAdapter encounters multiple result sets, it creates multiple tables in the DataSet. Diesen Tabellen werden standardmäßig Namen nach dem Schema TableN, beginnend mit "Table" für Table0, zugewiesen, die jeweils um eins erhöht werden.The tables are given an incremental default name of TableN, starting with "Table" for Table0. Wenn der Tabellenname als Argument an die Fill -Methode übergeben wird, erhalten die Tabellen standardmäßig Namen nach dem Schema TableNameN, beginnend mit "TableName" für TableName0, die jeweils um eins erhöht werden.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.

Auffüllen eines DataSets mit mehreren DataAdapter-ObjektenPopulating a DataSet from Multiple DataAdapters

Eine beliebige Anzahl von DataAdapter Objekte können verwendet werden, mit einem DataSet.Any number of DataAdapter objects can be used with a DataSet. Mit jedem DataAdapter -Objekt können ein oder mehrere DataTable -Objekte gefüllt und Updates in die zugehörige Datenquelle übernommen werden.Each DataAdapter can be used to fill one or more DataTable objects and resolve updates back to the relevant data source. DasDataRelation -Objekt und das Constraint -Objekt können dem DataSet lokal hinzugefügt werden. Dadurch haben Sie die Möglichkeit, Daten aus mehreren unähnlichen Datenquellen zu verbinden.DataRelation and Constraint objects can be added to the DataSet locally, which enables you to relate data from dissimilar data sources. Ein DataSet kann beispielsweise Daten aus einer Microsoft SQL Server-Datenbank, einer über OLE DB verfügbar gemachten IBM DB2-Datenbank und einer XML-Datenquelle enthalten.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. Für die Kommunikation mit den einzelnen Datenquellen sind ein oder mehrere DataAdapter -Objekte zuständig.One or more DataAdapter objects can handle communication to each data source.

BeispielExample

Im folgenden Codebeispiel wird eine Kundenliste aus der Northwind -Datenbank unter Microsoft SQL Server sowie eine Auftragsliste aus der in Microsoft Access 2000 gespeicherten Northwind -Datenbank aufgefüllt.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. Die gefüllten Tabellen werden mit einer DataRelationverbunden, und die Kundenliste wird anschließend mit Aufträgen für den jeweiligen Kunden angezeigt.The filled tables are related with a DataRelation, and the list of customers is then displayed with the orders for that customer. Weitere Informationen zu DataRelation Objekten finden Sie Hinzufügen von "DataRelations" und Navigieren in DataRelations.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-Typ "decimal"SQL Server Decimal Type

In der Standardeinstellung werden Daten des DataSet mithilfe von .NET Framework.NET Framework -Datentypen gespeichert.By default, the DataSet stores data by using .NET Framework.NET Framework data types. Für die meisten Anwendungen sind diese sehr gut zur Darstellung der Informationen aus der Datenquelle geeignet.For most applications, these provide a convenient representation of data source information. Diese Darstellung kann jedoch problematisch werden, wenn es sich bei dem Datentyp in der Datenquelle um den SQL Server-Datentyp „decimal“ oder um einen numerischen Datentyp handelt.However, this representation may cause a problem when the data type in the data source is a SQL Server decimal or numeric data type. Der .NET Framework.NET Framework decimal data type allows a maximum of 28 significant digits, whereas the SQL Server decimal data type allows 38 significant digits.The .NET Framework.NET Framework decimal data type allows a maximum of 28 significant digits, whereas the SQL Server decimal data type allows 38 significant digits. Wenn der SqlDataAdapter während eines Fill -Vorgangs feststellt, dass die Präzision eines SQL Server-Felds mit dem Datentyp decimal mehr als 28 Zeichen beträgt, wird der DataTabledie aktuelle Zeile nicht hinzugefügt.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. Stattdessen tritt das FillError -Ereignis auf. Dadurch können Sie überprüfen, ob ein Präzisionsverlust eintritt, und Sie können entsprechend reagieren.Instead the FillError event occurs, which enables you to determine whether a loss of precision will occur, and respond appropriately. Weitere Informationen zu den FillError Ereignis finden Sie unter Behandeln von DataAdapter-Ereignissen.For more information about the FillError event, see Handling DataAdapter Events. Den SQL Server-Wert decimal erhalten Sie auch, indem Sie ein SqlDataReader -Objekt verwenden und die GetSqlDecimal -Methode aufrufen.To get the SQL Server decimal value, you can also use a SqlDataReader object and call the GetSqlDecimal method.

ADO.NETADO.NET 2.0 enthält erweiterte Unterstützung für System.Data.SqlTypes im DataSet.2.0 introduced enhanced support for System.Data.SqlTypes in the DataSet. Weitere Informationen finden Sie unter SqlTypes and the DataSet.For more information, see SqlTypes and the DataSet.

OLE DB-KapitelOLE DB Chapters

Hierarchische Rowsets oder Kapitel (OLE DB-Typ DBTYPE_HCHAPTER, ADO-Typ adChapter) können zum Füllen des DataSet-Inhalts verwendet werden.Hierarchical rowsets, or chapters (OLE DB type DBTYPE_HCHAPTER, ADO type adChapter) can be used to fill the contents of a DataSet. Wenn das OleDbDataAdapter -Objekt während eines Fill -Vorgangs eine in Kapitel unterteilte Spalte ermittelt, wird für diese Spalte eine DataTable erstellt, die mit den Spalten und Zeilen aus dem Kapitel gefüllt wird.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. Als Name der Tabelle, die für die in Kapitel unterteilte Spalte erstellt wird, werden der Name der übergeordneten Tabelle und der Name der in Kapitel unterteilten Spalte im folgenden Format verwendet: "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". Wenn im DataSet bereits eine Tabelle vorhanden ist, deren Name dem Namen der in Kapitel unterteilten Spalte entspricht, wird die aktuelle Tabelle mit den Kapiteldaten gefüllt.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. Wenn in einer vorhandenen Tabelle keine Spalte existiert, die einer Spalte im Kapitel entspricht, wird eine neue Spalte hinzugefügt.If there is no column in an existing table that matches a column found in the chapter, a new column is added.

Bevor die Tabellen im DataSet mit den Daten in den in Kapitel unterteilten Spalten gefüllt werden, wird eine Beziehung zwischen der übergeordneten und der untergeordneten Tabelle des hierarchischen Rowsets erstellt, indem sowohl der übergeordneten als auch der untergeordneten Tabelle eine Ganzzahlenspalte hinzugefügt wird. Für die übergeordnete Spalte wird die automatische Erhöhung festgelegt, und mit den hinzugefügten Spalten beider Tabellen wird eine DataRelation erstellt.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. Die hinzugefügte Beziehung wird unter Verwendung des Namens der übergeordneten Tabelle und des Namens der Kapitelspalte folgendermaßen benannt: "ParentTableNameChapterColumnName".The added relation is named by using the parent table and chapter column names in the form "ParentTableNameChapterColumnName".

Beachten Sie, dass die entsprechende Spalte nur im DataSetvorhanden ist.Note that the related column only exists in the DataSet. Bei nachfolgenden Füllungen aus der Datenquelle werden den Tabellen möglicherweise neue Zeilen hinzugefügt, anstatt die Änderungen in vorhandene Zeilen zusammenzuführen.Subsequent fills from the data source can cause new rows to be added to the tables instead of changes being merged into existing rows.

Beachten Sie auch, dass bei Verwendung der DataAdapter.Fill -Überladung mit einer DataTablenur diese Tabelle gefüllt wird.Note also that, if you use the DataAdapter.Fill overload that takes a DataTable, only that table will be filled. Eine Ganzzahlenspalte mit automatischer Erhöhung wird der Tabelle ebenfalls hinzugefügt, es wird jedoch keine untergeordnete Tabelle erstellt oder gefüllt und keine Beziehung erstellt.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.

Im folgenden Beispiel wird mit dem MSDataShape-Anbieter eine Kapitelspalte von Bestellungen für jeden Kunden aus einer Kundenliste generiert.The following example uses the MSDataShape Provider to generate a chapter column of orders for each customer in a list of customers. Anschließend wird ein DataSet mit den Daten gefüllt.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");  
}  

Nach Abschluss des Fill -Vorgangs enthält das DataSet zwei Tabellen: Customers und CustomersOrders, wobei CustomersOrders die in Kapitel unterteilte Spalte darstellt.When the Fill operation is complete, the DataSet contains two tables: Customers and CustomersOrders, where CustomersOrders represents the chaptered column. Eine weitere Spalte mit dem Namen Orders wird der Tabelle Customers hinzugefügt. Der Tabelle CustomersOrders wird eine zusätzliche Spalte mit dem Namen CustomersOrders hinzugefügt.An additional column named Orders is added to the Customers table, and an additional column named CustomersOrders is added to the CustomersOrders table. Die Spalte Orders in der Tabelle Customers wird auf die automatische Erhöhung festgelegt.The Orders column in the Customers table is set to auto-increment. Eine DataRelation, nämlich CustomersOrders, wird mithilfe der Spalten erstellt, die den Tabellen mit Customers als übergeordnete Tabelle hinzugefügt wurden.A DataRelation, CustomersOrders, is created by using the columns that were added to the tables with Customers as the parent table. In den folgenden Tabellen sind einige Beispiele dargestellt.The following tables show some sample results.

TableName: KundenTableName: Customers

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

TableName: CustomersOrdersTableName: CustomersOrders

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

Siehe auchSee also