Naplnění datové sady z objektu DataAdapter

Platí pro: .NET Framework .NET Standard

Stáhnout ADO.NET

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 SelectCommandDataAdapter je Command objekt, který získává 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 DataSet. Tyto vlastnosti jsou podrobněji popsány v aktualizaci zdrojů dat pomocí objektů DataAdapter.

Metoda Fill je použita k naplnění DataAdapter výsledky DataSetSelectCommand.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 řešením je načítat řádky v dávkách (například několik stovek řádků najednou) a načíst další dávku, až 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 neexistují ve zdroji dat a . je nastavena na.. Pokud Fill zjistí, že pro tabulku existuje primární klíč, přepíše data ve DataSet daty ze zdroje dat 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í objektů 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 zajistili správné vyřešení duplicitních řádků.

Následující příklad kódu vytvoří instanci SqlDataAdapter, která používá SqlConnection do databáze Microsoft SQL Server Northwind a naplní seznam zákazníků do DataTable v DataSet. Příkaz SQL a SqlConnection argumenty předané SqlDataAdapter konstruktoru slouží k vytvoření SelectCommand vlastnosti SqlDataAdapter.

Example

// 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, pokud zjistí, že připojení, které DataAdapter používá, ještě není otevřené. Pokud Fill otevřelo připojení, také ho zavře, když Fill skončí. To může zjednodušit kód, když se jedná o jednu operaci, 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 výsledkových sad

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í datové sady z několika objektů DataAdapter

Libovolný počet DataAdapter objektů lze použít s parametrem DataSet. Každý DataAdapter lze použít k naplnění jednoho nebo více DataTable objektů a vracení 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.

Example

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 databáze uložené v Microsoft Accessu Northwind . Vyplněné tabulky souvisejí s DataRelation a seznam zákazníků se pak zobrazí s objednávkami pro daného zákazníka.

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"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ů .NET. 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 .NET decimal umožňuje maximálně 28 platný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 události FillError 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 zahrnuje rozšířenou podporu také pro System.Data.SqlTypes v DataSet. Další informace naleznete v tématu SqlTypes a DataSet.