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 DataAdapter
Command
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 DataSet
lé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 SelectCommand
DataAdapter
DataSet
DataAdapter
a . Fill
argumentumaként egy DataSet
kitöltendő, egy DataTable
objektumot vagy a DataTable
kitöltendők nevét veszi figyelembe a visszaadott SelectCommand
sorokkal.
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 DataSet
lé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 DataAdapter
MissingSchemaAction
.értékre MissingSchemaAction
AddWithKey
van á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 Connection
DataAdapter
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 Update
mű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 Open
Connection
alkalmazás metódusát, végrehajtja a műveleteket az adatforráson, majd meghívja a Close
Connection
metó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 DataTable
haszná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 CustomersOrders
ahol 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
, CustomersOrders
azokat 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 |