Sdílet prostřednictvím


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 DataAdapterprostř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 UpdateCommandInsertCommand 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 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řily, pokud ve zdroji dat neexistují a DataAdapterMissingSchemaAction 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 DataTablehodnotu . 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 Updateje 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 DataSetví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 DataRelationseznam 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_HCHAPTEROLE DB , typ adChapterADO) 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, 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.

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

Viz také