Megosztás a következőn keresztül:


Adathalmaz feltöltése DataAdapterből

A ADO.NET DataSet az adatok memóriarezidens ábrázolása, amely az adatforrástól független, konzisztens relációs programozási modellt biztosít. Ez DataSet egy teljes adatkészletet jelöl, amely táblákat, korlátozásokat és kapcsolatokat tartalmaz a táblák között. Mivel az DataSet adatforrás független az adatforrástól, az DataSet alkalmazás helyi adatait és több adatforrásból származó adatokat is tartalmazhat. A meglévő adatforrásokkal való interakciót a rendszer a DataAdapter.

A SelectCommand tulajdonság DataAdapterCommand egy olyan objektum, amely adatokat kér le az adatforrásból. A InsertCommand, UpdateCommandés DeleteCommand tulajdonságok DataAdapter olyan Command objektumok, amelyek az adatforrásban lévő adatok frissítéseit kezelik a benne DataSetlévő adatok módosításainak megfelelően. Ezekről a tulajdonságokról részletesebben az adatforrások dataAdapters-ekkel való frissítéséről olvashat.

A Fill metódus SelectCommandDataAdapterDataSetDataAdaptera . Fill argumentumaként egy DataSet kitöltendő, egy DataTable objektumot vagy a DataTable kitöltendők nevét veszi figyelembe a visszaadott SelectCommandsorokkal.

Feljegyzés

DataAdapter Az összes tábla lekérése időt vesz igénybe, különösen akkor, ha sok sor van a táblában. Ennek az az oka, hogy az adatbázis elérése, az adatok keresése és feldolgozása, majd az adatok átvitele az ügyfélnek időigényes. Ha az összes táblát az ügyfélhez húzza, a kiszolgáló összes sorát zárolja. A teljesítmény javítása érdekében a WHERE záradékkal jelentősen csökkentheti az ügyfélnek visszaadott sorok számát. Az ügyfélnek visszaadott adatok mennyiségét úgy is csökkentheti, hogy csak a szükséges oszlopokat sorolja fel explicit módon az SELECT utasításban. Egy másik jó áthidaló megoldás a sorok kötegekben való lekérése (például egyszerre több száz sor), és csak a következő köteg lekérése, amikor az ügyfél befejeződött az aktuális köteggel.

A Fill metódus implicit DataReader módon az objektummal adja vissza a táblák DataSetlétrehozásához használt oszlopneveket és típusokat, valamint az adatokat a táblák sorainak feltöltéséhez.DataSet A táblák és oszlopok csak akkor jönnek létre, ha még nem léteznek; máskülönben Fill a meglévő DataSet sémát használja. Az oszloptípusok .NET-keretrendszer típusokként jönnek létre a ADO.NET Adattípus-leképezések tábláinak megfelelően. Az elsődleges kulcsok csak akkor jönnek létre, ha az adatforrásban léteznek, és DataAdapterMissingSchemaAction.értékre MissingSchemaActionAddWithKeyvan állítva. Ha Fill úgy találja, hogy egy tábla elsődleges kulcsa létezik, felülírja az DataSet adatforrásból származó adatokat olyan sorok esetében, ahol az elsődleges kulcs oszlopértékei megegyeznek az adatforrásból visszaadott sor adataival. Ha nem található elsődleges kulcs, az adatok hozzá lesznek fűzve a táblákhoz a DataSet. Fill a feltöltéskor DataSet esetlegesen létező leképezéseket használja (lásd : DataAdapter DataTable és DataColumn Mappings).

Feljegyzés

Ha a SelectCommand KÜLSŐ ILLESZTÉS eredményét adja vissza, akkor a DataAdapter rendszer nem állít be PrimaryKey értéket az eredményül kapotthoz DataTable. Meg kell határoznia saját PrimaryKey magát, hogy meggyőződjön arról, hogy az ismétlődő sorok megfelelően vannak feloldva. További információ: Elsődleges kulcsok definiálása.

Az alábbi példakód egy olyan példányt hoz létre, amely a Microsoft SQL Server-adatbázishoz Northwind használ egy SqlConnection példánytSqlDataAdapter, és feltölt egy DataTable példányt DataSet az ügyfelek listájával. A konstruktornak átadott SQL-utasítás és SqlConnection argumentumok a SelectCommandSqlDataAdapter.SqlDataAdapter

Példa

' 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");  

Feljegyzés

Az ebben a példában látható kód nem nyitja meg és zárja be kifejezetten a Connection. A Fill metódus implicit módon megnyitja a ConnectionDataAdapter használt eszközt, ha úgy találja, hogy a kapcsolat még nincs megnyitva. Ha Fill megnyitotta a kapcsolatot, az is bezárja a kapcsolatot, amikor Fill befejeződött. Ez leegyszerűsítheti a kódot, ha egyetlen művelettel, például egy Fill vagy egy Updateművelettel foglalkozik. Ha azonban több olyan műveletet hajt végre, amely nyitott kapcsolatot igényel, javíthatja az alkalmazás teljesítményét, ha explicit módon meghívja az OpenConnectionalkalmazás metódusát, végrehajtja a műveleteket az adatforráson, majd meghívja a CloseConnectionmetódust. Próbálja meg a lehető legrövidebb ideig nyitva tartani az adatforrás kapcsolatait, hogy más ügyfélalkalmazások számára szabadítson fel erőforrásokat.

Több eredményhalmaz

Ha a DataAdapter művelet több eredményhalmazt is észlel, több táblát hoz létre a DataSet. A táblák az N táblanövekményes alapértelmezett nevét kapják, kezdve a Table0 táblához tartozó "Table" névvel. Ha egy táblanév argumentumként van átadva a Fill metódusnak, a táblák növekményes alapértelmezett TableNameN nevet kapnak, kezdve a TableName0 táblanév "TableName" nevével.

Adathalmaz feltöltése több adatadapterből

Tetszőleges számú DataAdapter objektum használható egy DataSet. Mindegyik DataAdapter használható egy vagy több DataTable objektum kitöltésére és a megfelelő adatforrás frissítéseinek feloldására. DataRelation és Constraint objektumokat adhat hozzá a DataSet helyi adatokhoz, amelyek lehetővé teszik az eltérő adatforrásokból származó adatok összekapcsolását. Például egy DataSet Microsoft SQL Server-adatbázisból származó adatokat, egy OLE DB-en keresztül közzétett IBM DB2-adatbázist és egy XML-et streamelő adatforrást tartalmazhat. Egy vagy több DataAdapter objektum képes kezelni az egyes adatforrásokkal folytatott kommunikációt.

Példa

Az alábbi példakód kitölti a Northwind Microsoft SQL Server adatbázisából származó ügyfelek listáját, valamint a Northwind Microsoft Access 2000-ben tárolt adatbázis megrendeléseinek listáját. A kitöltött táblák egy DataRelation, a vevők listáját pedig az adott ügyfél megrendeléseivel együtt jelenítik meg. Az objektumokról DataRelation további információt a DataRelations hozzáadása és a DataRelations navigálása című témakörben talál.

' 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 Decimális típus

Alapértelmezés szerint az DataSet adatok .NET-keretrendszer adattípusok használatával vannak tárolva. A legtöbb alkalmazás esetében ezek kényelmesen ábrázolják az adatforrások adatait. Ez a reprezentáció azonban problémát okozhat, ha az adatforrás adattípusa EGY SQL Server decimális vagy numerikus adattípus. A .NET-keretrendszer decimal adattípus legfeljebb 28 jelentős számjegyet tesz lehetővé, míg az SQL Server decimal adattípusa 38 jelentős számjegyet tesz lehetővé. Ha a művelet során Fill az SqlDataAdapter SQL Server-mező decimal pontossága 28 karakternél nagyobb, az aktuális sor nem lesz hozzáadva a DataTable. Ehelyett az FillError esemény következik be, amely lehetővé teszi annak meghatározását, hogy bekövetkezik-e a pontosságvesztés, és megfelelően válaszoljon. Az eseményről további információt a FillError DataAdapter-események kezelése című témakörben talál. Az SQL Server decimal értékének lekéréséhez használhat objektumot SqlDataReader is, és meghívhatja a metódust GetSqlDecimal .

ADO.NET 2.0 továbbfejlesztett támogatást System.Data.SqlTypes vezetett be a DataSet. További információ: SqlTypes és dataSet.

OLE DB-fejezetek

Hierarchikus sorhalmazok vagy fejezetek (OLE DB-típus DBTYPE_HCHAPTER, ADO-típus adChapter) használhatók egy DataSet. Amikor egy OleDbDataAdapter művelet során Fill egy fejezetes oszlopba ütközik, létrejön egy DataTable a fejezetes oszlophoz, és a táblázat tele van a fejezet oszlopaival és soraival. A fejezetes oszlophoz létrehozott tábla neve a szülőtábla nevével és a fejezetes oszlopnévvel is szerepel a "ParentTableNameChapteredColumnName" formában. Ha már létezik olyan tábla, amely megfelel a DataSet fejezetes oszlop nevének, az aktuális táblázat tele lesz a fejezet adataival. Ha nincs olyan oszlop egy meglévő táblában, amely megfelel a fejezetben található oszlopnak, a rendszer új oszlopot ad hozzá.

Mielőtt a táblák DataSet megtelnek a fejezetes oszlopokban lévő adatokkal, létrejön egy kapcsolat a hierarchikus sorhalmaz szülő- és gyermektáblái között, ha a szülő- és gyermektáblához egész oszlopot ad hozzá, a szülőoszlopot automatikus növekményre állítja, és mindkét DataRelation tábla hozzáadott oszlopait használja. A hozzáadott reláció neve a szülőtábla és a fejezetoszlop neve alapján történik a "ParentTableNameChapterColumnName" formában.

Vegye figyelembe, hogy a kapcsolódó oszlop csak a DataSet. Az adatforrás későbbi kitöltései új sorokat adhatnak hozzá a táblákhoz a módosítások meglévő sorokba való egyesítése helyett.

Vegye figyelembe azt is, hogy ha a DataAdapter.Fill túlterhelést DataTablehasználja, akkor csak az a táblázat lesz kitöltve. Az automatikusan növekvő egész számoszlop továbbra is hozzá lesz adva a táblához, de nem jön létre vagy nem töltődik ki gyermektábla, és nem jön létre kapcsolat.

Az alábbi példa az MSDataShape-szolgáltatót használja a rendelések fejezetoszlopának létrehozásához az ügyfelek listájában. Az A DataSet ekkor megtelik az adatokkal.

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");  
}  

Ha a Fill művelet befejeződött, a DataSet művelet két táblát tartalmaz: Customers és CustomersOrdersahol CustomersOrders a fejezetes oszlopot jelöli. A rendszer hozzáad egy további elnevezett Orders oszlopot a Customers táblához, és egy további, elnevezett CustomersOrders oszlopot ad hozzá a CustomersOrders táblához. A Orders táblázat oszlopa Customers automatikus növekményre van beállítva. Az A DataRelation, CustomersOrdersazokat az oszlopokat használja, amelyek szülőtábláként lettek hozzáadva a táblákhoz Customers . Az alábbi táblázatok néhány mintaeredményt mutatnak.

TableName: Ügyfelek

CustomerID (Ügyfél azonosítója) Cégnév Megrendelések
ALFKI Alfreds Futterkiste 0
ANATR Ana Trujillo Emparedados y helados 0

TableName: CustomersOrders

CustomerID (Ügyfél azonosítója) OrderID CustomersOrders
ALFKI 10643 0
ALFKI 10692 0
ANATR 10308 0
ANATR 10625 0

Lásd még