Naplnění datové sady z adaptéru dat
ADO.NET DataSet je reprezentace dat v paměti, která poskytuje konzistentní relační programovací model nezávislý na zdroji dat. Představuje DataSet
kompletní sadu dat, která zahrnují tabulky, omezení a relace mezi tabulkami. DataSet
Vzhledem k tomu, že je nezávislý na zdroji dat, DataSet
může obsahovat data místní pro aplikaci a data z více zdrojů dat. Interakce s existujícími zdroji dat je řízena DataAdapter
prostřednictvím .
Vlastnost SelectCommand
DataAdapter
je Command
objekt, který načte data ze zdroje dat. , a vlastnosti jsou Command
DataAdapter
objekty, které spravují aktualizace dat ve zdroji dat podle úprav dat v objektu DataSet
.DeleteCommand
UpdateCommand
InsertCommand
Tyto vlastnosti jsou podrobněji popsány v aktualizaci zdrojů dat pomocí objektů DataAdapter.
Metoda Fill
je použita k naplnění DataSet
výsledky SelectCommand
DataAdapter
.DataAdapter
Fill
přebírá jako argumenty DataSet
, které se mají vyplnit, a DataTable
objekt nebo název DataTable
, který má být vyplněný řádky vrácenými z objektu SelectCommand
.
Poznámka:
Použití funkce DataAdapter
k načtení všech tabulek nějakou dobu trvá, zejména pokud je v tabulce mnoho řádků. Důvodem je to, že přístup k databázi, vyhledání a zpracování dat a následný přenos dat klientovi je časově náročný. Přetažením všech tabulek do klienta se zamkne také všechny řádky na serveru. Pokud chcete zvýšit výkon, můžete pomocí WHERE
klauzule výrazně snížit počet řádků vrácených klientovi. Množství dat vrácených klientovi můžete také snížit pouze explicitním výpisem požadovaných sloupců v SELECT
příkazu. Dalším dobrým alternativním řešením je načíst řádky v dávkách (například několik stovek řádků najednou) a načíst další dávku pouze po dokončení klienta s aktuální dávkou.
Metoda Fill
používá DataReader
objekt implicitně k vrácení názvů a typů sloupců, které se používají k vytvoření tabulek v objektu DataSet
a data k naplnění řádků tabulek v objektu DataSet
. Tabulky a sloupce jsou vytvořeny pouze v případě, že ještě neexistují; v opačném případě Fill
používá existující DataSet
schéma. Typy sloupců se vytvářejí jako typy rozhraní .NET Framework podle tabulek v mapování datových typů v ADO.NET. Primární klíče se nevytvořily, pokud ve zdroji dat neexistují a DataAdapter
MissingSchemaAction
je nastavena naMissingSchemaAction
hodnotu ..AddWithKey
Pokud Fill
zjistíte, že pro tabulku existuje primární klíč, přepíše data ve DataSet
zdroji dat pro řádky, ve kterých hodnoty sloupce primárního klíče odpovídají hodnotám řádku vráceného ze zdroje dat. Pokud se nenajde žádný primární klíč, připojí se data k tabulkám v objektu DataSet
. Fill
používá všechna mapování, která mohou existovat při naplnění DataSet
(viz Mapování DataAdapter DataTable a DataColumn).
Poznámka:
SelectCommand
Pokud vrátí výsledky vnějšího spojení, DataAdapter
nenastaví PrimaryKey
hodnotu pro výslednou DataTable
hodnotu . Musíte definovat sami sebe, abyste měli jistotu PrimaryKey
, že se správně přeloží duplicitní řádky. Další informace naleznete v tématu Definování primárních klíčů.
Následující příklad kódu vytvoří instanci SqlDataAdapter , která používá SqlConnection databázi Microsoft SQL Serveru Northwind
a naplní DataTable seznam DataSet
zákazníků. Příkaz SQL a SqlConnection argumenty předané SqlDataAdapter konstruktoru slouží k vytvoření SelectCommand vlastnosti SqlDataAdapter.
Příklad
' 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");
Poznámka:
Kód zobrazený v tomto příkladu explicitně neotevře a zavře Connection
. Metoda Fill
implicitně otevře Connection
, že DataAdapter
se používá, pokud zjistí, že připojení ještě není otevřené. Pokud Fill
jste připojení otevřeli, připojení Fill
se po dokončení také zavře. To může zjednodušit kód při řešení jedné operace, jako Fill
Update
je například nebo . Pokud však provádíte více operací vyžadujících otevřené připojení, můžete zlepšit výkon aplikace explicitním voláním Open
metody Connection
, provedením operací se zdrojem dat a následným voláním Close
metody Connection
. Měli byste se pokusit zachovat připojení ke zdroji dat co nejdříve, abyste mohli uvolnit prostředky pro použití jinými klientskými aplikacemi.
Více sad výsledků
Pokud dojde k DataAdapter
více sadám výsledků, vytvoří v tabulce DataSet
více tabulek . Tabulky mají inkrementální výchozí název tabulkyN počínaje tabulkou "Table" pro Table0. Pokud je název tabulky předán jako argument metodě Fill
, tabulky mají přírůstkový výchozí název TableNameN počínaje "TableName" pro TableName0.
Naplnění datové sady z více objektů DataAdapter
Libovolný počet DataAdapter
objektů lze použít s parametrem DataSet
. Každý z nich DataAdapter
se dá použít k vyplnění jednoho nebo více DataTable
objektů a řešení aktualizací zpět na příslušný zdroj dat. DataRelation
a Constraint
objekty lze přidat do DataSet
místního prostředí, což umožňuje spojit data z různých zdrojů dat. Může například DataSet
obsahovat data z databáze Microsoft SQL Serveru, databáze IBM DB2 vystavená prostřednictvím OLE DB a zdroj dat, který streamuje XML. Jeden nebo více DataAdapter
objektů může zpracovávat komunikaci s každým zdrojem dat.
Příklad
Následující příklad kódu naplní seznam zákazníků z Northwind
databáze na Microsoft SQL Serveru a seznam objednávek z Northwind
databáze uložené v aplikaci Microsoft Access 2000. Vyplněné tabulky souvisejí s a DataRelation
seznam zákazníků se pak zobrazí s objednávkami pro daného zákazníka. Další informace o DataRelation
objektech naleznete v tématu Přidání DataRelations a Navigace 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"]);
}
Typ desetinného čísla SQL Serveru
Ve výchozím nastavení DataSet
se data ukládají pomocí datových typů rozhraní .NET Framework. Pro většinu aplikací poskytují pohodlné znázornění informací o zdroji dat. Toto vyjádření ale může způsobit problém, když je datový typ ve zdroji dat desetinný nebo číselný datový typ SQL Serveru. Datový typ rozhraní .NET Framework decimal
umožňuje maximálně 28 významných číslic, zatímco datový typ SQL Serveru decimal
umožňuje 38 významných číslic. Pokud se SqlDataAdapter
určí během Fill
operace, že přesnost pole SQL Serveru decimal
je větší než 28 znaků, aktuální řádek se nepřidá do DataTable
. FillError
Místo toho dojde k události, která umožňuje určit, zda dojde ke ztrátě přesnosti, a odpovídajícím způsobem reagovat. Další informace o FillError
události naleznete v tématu Zpracování událostí dataAdapter. K získání hodnoty SQL Serveru decimal
můžete také použít SqlDataReader objekt a volat metodu GetSqlDecimal .
ADO.NET 2.0 zavedla rozšířenou podporu pro System.Data.SqlTypes DataSet
Další informace naleznete v tématu SqlTypes a DataSet.
Kapitoly OLE DB
Hierarchické sady řádků nebo kapitoly (typ DBTYPE_HCHAPTER
OLE DB , typ adChapter
ADO) lze použít k vyplnění obsahu objektu DataSet
. OleDbDataAdapter Když během operace narazí na sloupec s Fill
kapitolou, DataTable
vytvoří se pro sloupec s kapitolou a tato tabulka se vyplní sloupci a řádky z kapitoly. Tabulka vytvořená pro sloupec s kapitolou má název jak název nadřazené tabulky, tak název sloupce s kapitolou ve formuláři ParentTableNameChapteredColumnName. Pokud tabulka již existuje v DataSet
tabulce, která odpovídá názvu sloupce kapitoly, bude aktuální tabulka vyplněna daty kapitoly. Pokud v existující tabulce neexistuje žádný sloupec, který odpovídá sloupci nalezeného v kapitole, přidá se nový sloupec.
Před vyplněním tabulek v DataSet
tabulkách ve sloupcích kapitol se vytvoří relace mezi nadřazenými a podřízenými tabulkami hierarchické sady řádků přidáním celočíselného sloupce do nadřazené i podřízené tabulky, nastavením nadřazeného sloupce na automatické přírůstky a vytvořením DataRelation
přidaného sloupce z obou tabulek. Přidaný vztah je pojmenován pomocí nadřazené tabulky a názvy sloupců kapitoly ve formuláři "ParentTableNameChapterColumnName".
Všimněte si, že související sloupec existuje pouze v sadě DataSet
. Následné výplně ze zdroje dat můžou způsobit přidání nových řádků do tabulek místo toho, aby se změny sloučily do existujících řádků.
Všimněte si také, že pokud použijete DataAdapter.Fill
přetížení, které přebírá DataTable
, bude vyplněna pouze tato tabulka. Sloupec s automatickým přírůstkem celého čísla bude stále přidán do tabulky, ale nebude vytvořena ani vyplněna žádná podřízená tabulka a nebude vytvořena žádná relace.
Následující příklad používá poskytovatele MSDataShape k vygenerování sloupce kapitol objednávek pro každého zákazníka v seznamu zákazníků. A DataSet
se pak vyplní daty.
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
Po dokončení DataSet
operace obsahuje dvě tabulky: Customers
a CustomersOrders
, kde CustomersOrders
představuje sloupec s kapitolou. Do tabulky se přidá Customers
další pojmenovaný sloupec Orders
a do CustomersOrders
tabulky se přidá další sloupec s názvemCustomersOrders
. Sloupec Orders
v Customers
tabulce je nastavený na automatické přírůstky. A DataRelation
, CustomersOrders
je vytvořen pomocí sloupců, které byly přidány do tabulek s Customers
jako nadřazenou tabulkou. V následujících tabulkách jsou uvedeny ukázkové výsledky.
TableName: Customers
CustomerID | CompanyName | Objednávky |
---|---|---|
ALFKI | Alfreds Futterkiste | 0 |
ANATR | Ana Trujillo Emparedados y helados | 0 |
TableName: CustomersOrders
CustomerID | OrderID | CustomersOrders |
---|---|---|
ALFKI | 10643 | 0 |
ALFKI | 10692 | 0 |
ANATR | 10308 | 0 |
ANATR | 10625 | 0 |