Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 DataAdapterprostřednictvím .
Vlastnost SelectCommand u DataAdapter je objekt Command, který načítá data ze zdroje dat. Vlastnosti InsertCommand, UpdateCommand, a DeleteCommand objektu DataAdapter jsou Command objekty, které spravují aktualizace dat ve zdroji dat podle úprav provedených na datech v objektu DataSet. Tyto vlastnosti jsou podrobněji popsány v aktualizaci zdrojů dat pomocí objektů DataAdapter.
Metoda FillDataAdapter je použita k naplnění DataSet výsledky SelectCommandDataAdapter.
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 řešením je načítat řádky v dávkách (například několik stovek řádků najednou) a načíst další dávku pouze poté, co klient dokončí práci 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 DataSeta 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ří, pokud již neexistují ve zdroji dat a DataAdapter není nastavena na MissingSchemaActionMissingSchemaAction Pokud Fill zjistí, že pro tabulku existuje primární klíč, přepíše data v DataSet daty ze zdroje pro řádky, kde 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:
Pokud SelectCommand vrátí výsledky vnějšího spojení, DataAdapter nenastaví hodnotu PrimaryKey pro výsledný DataTable. Musíte definovat PrimaryKey sami, abyste měli jistotu, že se duplicitní řádky správně vyřeší. 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 k databázi Microsoft SQL Server Northwind a naplní DataTable v DataSet seznamem 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, které používá DataAdapter, pokud zjistí, že připojení ještě není otevřené. Pokud Fill otevře připojení, také ho zavře, až Fill dokončí. To může zjednodušit váš kód při řešení jedné operace, jako je například Fill nebo Update. 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 DataAdapter narazí na více sad výsledků, vytvoří v 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í objektu DataSet z více objektů DataAdapter
Libovolný počet DataAdapter objektů lze použít s parametrem DataSet. Každý DataAdapter lze použít k vyplnění jednoho nebo více DataTable objektů a předání 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 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 zavedlo rozšířenou podporu pro System.Data.SqlTypes v DataSet. Další informace naleznete v tématu SqlTypes a DataSet.
Kapitoly OLE DB
Hierarchické sady řádků nebo kapitoly (typ DBTYPE_HCHAPTEROLE DB , typ adChapterADO) lze použít k vyplnění obsahu objektu DataSet.
OleDbDataAdapter při operaci narazí na sloupec s kapitolou Fill, vytvoří se DataTable pro tento sloupec a tabulka se naplní sloupci a řádky z kapitoly. Tabulka vytvořená pro sloupec s dílčími kapitolami je pojmenována použitím názvu nadřazené tabulky a názvu sloupce s dílčími kapitolami ve tvaru "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.
Než se tabulky v DataSet naplní daty v kapitolových sloupcích, vytvoří se relace mezi nadřazenými a podřízenými tabulkami hierarchické sady řádků přidáním celočíselného sloupce do obou tabulek, nastavením, aby se sloupec v nadřazené tabulce automaticky navyšoval, a vytvořením DataRelation pomocí přidaných sloupců z obou tabulek. Přidaný vztah je pojmenován pomocí názvu nadřazené tabulky a názvů sloupců kapitoly ve formátu "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 přetížení DataAdapter.Fill, které přijímá DataTable, vyplní se jen 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ů. Do DataSet se poté vyplní 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 Po dokončení DataSet operace obsahuje dvě tabulky: Customers a CustomersOrders, kde CustomersOrders představuje sloupec s kapitolou. Do tabulky Orders se přidá další pojmenovaný sloupec Customers a do tabulky CustomersOrders se přidá další sloupec s názvem CustomersOrders. Sloupec Orders v Customers tabulce je nastavený na automatické přírůstky. A DataRelation, CustomersOrdersje 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.
NázevTabulky: Zákazníci
| identifikátor zákazníka | Název společnosti | Objednávky |
|---|---|---|
| ALFKI | Alfreds Futterkiste | 0 |
| ANATR | Ana Trujillo Sendviče a zmrzliny | 1 |
TableName: ZákaznickéObjednávky
| identifikátor zákazníka | ID objednávky | Objednávky zákazníků |
|---|---|---|
| ALFKI | 10643 | 0 |
| ALFKI | 10692 | 0 |
| ANATR | 10308 | 1 |
| ANATR | 10625 | 1 |