Fylla i en datauppsättning från en DataAdapter
ADO.NET DataSet är en minnesbaserad representation av data som tillhandahåller en konsekvent relationsprogrammeringsmodell oberoende av datakällan. DataSet
Representerar en fullständig uppsättning data som innehåller tabeller, begränsningar och relationer mellan tabellerna. Eftersom är DataSet
oberoende av datakällan kan en DataSet
innehålla data som är lokala för programmet och data från flera datakällor. Interaktion med befintliga datakällor styrs via DataAdapter
.
Egenskapen SelectCommand
DataAdapter
för är ett Command
objekt som hämtar data från datakällan. Egenskaperna , och är objekt som hanterar uppdateringar av DataAdapter
data i datakällan enligt ändringar som gjorts i data i DataSet
.Command
DeleteCommand
UpdateCommand
InsertCommand
Dessa egenskaper beskrivs mer detaljerat i Uppdatera datakällor med DataAdapters.
Metoden Fill
för används för att fylla i en DataSet
med resultatet av SelectCommand
DataAdapter
.DataAdapter
Fill
tar som argument en DataSet
som ska fyllas i, och ett DataTable
objekt, eller namnet på den DataTable
som ska fyllas med raderna som returneras från SelectCommand
.
Kommentar
DataAdapter
Det tar tid att hämta alla en tabell, särskilt om det finns många rader i tabellen. Det beror på att det är tidskrävande att komma åt databasen, hitta och bearbeta data och sedan överföra data till klienten. Om du drar hela tabellen till klienten låss även alla rader på servern. För att förbättra prestandan WHERE
kan du använda -satsen för att avsevärt minska antalet rader som returneras till klienten. Du kan också minska mängden data som returneras till klienten genom att endast uttryckligen visa obligatoriska kolumner i -instruktionen SELECT
. En annan bra lösning är att hämta raderna i batchar (till exempel flera hundra rader i taget) och bara hämta nästa batch när klienten är klar med den aktuella batchen.
Metoden Fill
använder DataReader
-objektet implicit för att returnera kolumnnamnen och typerna som används för att skapa tabellerna DataSet
i , och data för att fylla i raderna i tabellerna DataSet
i . Tabeller och kolumner skapas bara om de inte redan finns. använder annars Fill
det befintliga DataSet
schemat. Kolumntyper skapas som .NET Framework-typer enligt tabellerna i Datatypmappningar i ADO.NET. Primära nycklar skapas inte om de inte finns i datakällan och DataAdapter
.MissingSchemaAction
har angetts till MissingSchemaAction
.AddWithKey
. Om Fill
det konstateras att det finns en primärnyckel för en tabell skrivs data över i DataSet
med-data från datakällan för rader där primärnyckelkolumnvärdena matchar värdena för raden som returneras från datakällan. Om ingen primärnyckel hittas läggs data till i tabellerna DataSet
i . Fill
använder alla mappningar som kan finnas när du fyller i DataSet
(se DataAdapter DataTable- och DataColumn-mappningar).
Kommentar
SelectCommand
Om returnerar resultatet av en YTTRE KOPPLING DataAdapter
anger inte ett PrimaryKey
värde för den resulterande DataTable
. Du måste definiera PrimaryKey
dig själv för att dubbletter av rader ska matchas korrekt. Mer information finns i Definiera primära nycklar.
I följande kodexempel skapas en instans av en SqlDataAdapter som använder en SqlConnection till Microsoft SQL Server-databasen Northwind
och fyller i en i en DataTable DataSet
med listan över kunder. SQL-instruktionen och SqlConnection argumenten SqlDataAdapter som skickas till konstruktorn används för att skapa SelectCommand egenskapen SqlDataAdapterför .
Exempel
' 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");
Kommentar
Koden som visas i det här exemplet öppnar inte uttryckligen Connection
och stänger inte . Metoden Fill
öppnar Connection
implicit det som DataAdapter
används om den upptäcker att anslutningen inte redan är öppen. Om Fill
anslutningen öppnas stängs även anslutningen när Fill
den är klar. Detta kan förenkla koden när du hanterar en enda åtgärd, till exempel en Fill
eller en Update
. Men om du utför flera åtgärder som kräver en öppen anslutning kan du förbättra programmets prestanda genom att uttryckligen anropa Open
metoden Connection
för , utföra åtgärderna mot datakällan och sedan anropa Close
metoden Connection
för . Du bör försöka hålla anslutningarna till datakällan öppna så kort som möjligt för att frigöra resurser för användning av andra klientprogram.
Flera resultatuppsättningar
Om det DataAdapter
uppstår flera resultatuppsättningar skapas flera tabeller i DataSet
. Tabellerna får ett inkrementellt standardnamn för TabellN, från och med "Tabell" för Table0. Om ett tabellnamn skickas som ett argument till Fill
metoden får tabellerna ett inkrementellt standardnamn för TableNameN, som börjar med "TableName" för TableName0.
Fylla i en datauppsättning från flera DataAdapters
Valfritt antal DataAdapter
objekt kan användas med en DataSet
. Var DataAdapter
och en kan användas för att fylla ett eller flera DataTable
objekt och lösa uppdateringar tillbaka till relevant datakälla. DataRelation
och Constraint
objekt kan läggas till DataSet
lokalt, vilket gör att du kan relatera data från olika datakällor. En kan till exempel DataSet
innehålla data från en Microsoft SQL Server-databas, en IBM DB2-databas som exponeras via OLE DB och en datakälla som strömmar XML. Ett eller flera DataAdapter
objekt kan hantera kommunikation till varje datakälla.
Exempel
I följande kodexempel fylls en lista över kunder från Northwind
databasen på Microsoft SQL Server och en lista över beställningar från databasen Northwind
som lagras i Microsoft Access 2000. De ifyllda tabellerna är relaterade till en DataRelation
, och listan över kunder visas sedan med beställningarna för den kunden. Mer information om DataRelation
objekt finns i Lägga till DataRelations och Navigera i 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-decimaltyp
Som standard lagrar data DataSet
med hjälp av .NET Framework-datatyper. För de flesta program ger dessa en bekväm representation av datakällans information. Den här representationen kan dock orsaka problem när datatypen i datakällan är en SQL Server-decimal eller numerisk datatyp. Datatypen .NET Framework decimal
tillåter högst 28 signifikanta siffror, medan SQL Server-datatypen decimal
tillåter 38 signifikanta siffror. SqlDataAdapter
Om avgör under en Fill
åtgärd att precisionen för ett SQL Server-fält decimal
är större än 28 tecken läggs inte den aktuella raden till i DataTable
. FillError
I stället inträffar händelsen, som gör att du kan avgöra om en förlust av precision kommer att inträffa och svara på rätt sätt. Mer information om händelsen finns i FillError
Hantera DataAdapter-händelser. Om du vill hämta SQL Server-värdet decimal
kan du också använda ett SqlDataReader objekt och anropa GetSqlDecimal metoden.
ADO.NET 2.0 introducerade förbättrat stöd för System.Data.SqlTypes i DataSet
. Mer information finns i SqlTypes och DataSet.
OLE DB-kapitel
Hierarkiska raduppsättningar eller kapitel (OLE DB-typ DBTYPE_HCHAPTER
, ADO-typ adChapter
) kan användas för att fylla innehållet i en DataSet
. När påträffar OleDbDataAdapter en kapitelkolumn under en Fill
åtgärd skapas en DataTable
för den kapitlade kolumnen, och den tabellen fylls med kolumnerna och raderna från kapitlet. Tabellen som skapats för den kapitelindelade kolumnen namnges med hjälp av både det överordnade tabellnamnet och det kapitlade kolumnnamnet i formatet "ParentTableNameChapteredColumnName". Om det redan finns en tabell i DataSet
som matchar namnet på den kapitlade kolumnen fylls den aktuella tabellen med kapiteldata. Om det inte finns någon kolumn i en befintlig tabell som matchar en kolumn som finns i kapitlet läggs en ny kolumn till.
Innan tabellerna i fylls med data i de kapitlade kolumnerna skapas en relation mellan de överordnade och underordnade tabellerna i DataSet
den hierarkiska raduppsättningen genom att lägga till en heltalskolumn i både den överordnade och underordnade tabellen, ange den överordnade kolumnen till automatisk inkrementering och skapa en DataRelation
med hjälp av de tillagda kolumnerna från båda tabellerna. Den tillagda relationen namnges med hjälp av de överordnade tabell- och kapitelkolumnnamnen i formatet "ParentTableNameChapterColumnName".
Observera att den relaterade kolumnen bara finns i DataSet
. Efterföljande fyllningar från datakällan kan leda till att nya rader läggs till i tabellerna i stället för att ändringar sammanfogas till befintliga rader.
Observera också att om du använder överlagringen DataAdapter.Fill
som tar en DataTable
, fylls endast tabellen i. En automatisk inkrementell heltalskolumn läggs fortfarande till i tabellen, men ingen underordnad tabell skapas eller fylls i och ingen relation skapas.
I följande exempel används MSDataShape-providern för att generera en kapitelkolumn med beställningar för varje kund i en lista över kunder. A DataSet
fylls sedan med 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");
}
När åtgärden Fill
är klar innehåller den DataSet
två tabeller: Customers
och CustomersOrders
, där CustomersOrders
representerar den kapitlade kolumnen. Ytterligare en kolumn med namnet Orders
läggs till i Customers
tabellen och ytterligare en kolumn med namnet CustomersOrders
läggs till i CustomersOrders
tabellen. Kolumnen Orders
i tabellen är inställd på Customers
automatisk inkrementering. En DataRelation
, CustomersOrders
, skapas med hjälp av kolumnerna som lades till i tabellerna med Customers
som överordnad tabell. Följande tabeller visar några exempelresultat.
TableName: Kunder
CustomerID | CompanyName | Ordrar |
---|---|---|
ALFKI | Alfreds Futterkiste | 0 |
ANATR | Ana Trujillo Emparedados y helados | 1 |
TableName: CustomersOrders
CustomerID | OrderID | CustomersOrders |
---|---|---|
ALFKI | 10643 | 0 |
ALFKI | 10692 | 0 |
ANATR | 10308 | 1 |
ANATR | 10625 | 1 |