Nyelv
Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Batch támogatása az ADO.NET-ben lehetővé teszi, hogy a DataAdapter az INSERT, UPDATE és DELETE műveleteket a DataSet-ból vagy DataTable-ból a szerverre csoportosítsa, ahelyett, hogy a műveleteket egyenként küldene. A kiszolgálóra irányuló kerek utak számának csökkentése általában jelentős teljesítménynövekedést eredményez. A Batch-frissítések az SQL Server () és az Oracle (System.Data.SqlClientSystem.Data.OracleClient) .NET-adatszolgáltatói számára támogatottak.
Amikor az adatbázis frissítése az ADO.NET korábbi verzióinak DataSet módosításaival történik, egy UpdateDataAdapter metódusa egy soronként végezte el a frissítéseket az adatbázison. Ahogy a megadott DataTable sorokon haladt végig, mindegyik DataRow-nél megvizsgálta, hogy módosították-e. Ha a sort módosították, a sor UpdateCommand tulajdonságának értékétől függően a megfelelő InsertCommand, DeleteCommand vagy RowState lett meghívva. Minden sorfrissítés hálózati körutat igényelt az adatbázishoz.
ADO.NET 2.0-tól kezdve a DbDataAdapter egy UpdateBatchSize tulajdonságot tesz elérhetővé.
UpdateBatchSize A pozitív egész szám értékének beállítása miatt az adatbázis frissítései a megadott méretű kötegekként lesznek elküldve. A 10 értékre állítás UpdateBatchSize például 10 különálló utasítást csoportosít, és egyetlen kötegként küldi el őket. A UpdateBatchSize 0 értékre állítással a DataAdapter kiszolgáló által kezelhető legnagyobb kötegméretet használhatja. Ha 1-re állítja, letiltja a kötegfrissítéseket, mivel a sorok egyenként lesznek elküldve.
Egy rendkívül nagy köteg végrehajtása csökkentheti a teljesítményt. Ezért az alkalmazás implementálása előtt tesztelnie kell az optimális kötegméret-beállítást.
Az UpdateBatchSize tulajdonság használata
Ha a kötegfrissítések engedélyezve vannak, a UpdatedRowSource DataAdapter tulajdonságértékének UpdateCommandInsertCommandDeleteCommand a következőre kell lennie: None vagy OutputParameters. Kötegfrissítés végrehajtásakor a parancs UpdatedRowSource tulajdonságértéke FirstReturnedRecord vagy Both érvénytelen.
Az alábbi eljárás bemutatja a UpdateBatchSize tulajdonság használatát. Az eljárás két argumentumot vesz fel, egy DataSet objektumot, amelynek oszlopai a ProductCategoryIDName tábla mezőit és mezőit jelölik, és egy egész szám, amely a köteg méretét (a köteg sorainak számát) jelöli. A kód létrehoz egy új SqlDataAdapter objektumot, amely beállítja annak UpdateCommand, InsertCommandés DeleteCommand tulajdonságait. A kód feltételezi, hogy az DataSet objektumnak van módosított sora. Beállítja a tulajdonságot UpdateBatchSize , és végrehajtja a frissítést.
Public Sub BatchUpdate( _
ByVal dataTable As DataTable, ByVal batchSize As Int32)
' Assumes GetConnectionString() returns a valid connection string.
Dim connectionString As String = GetConnectionString()
' Connect to the AdventureWorks database.
Using connection As New SqlConnection(connectionString)
' Create a SqlDataAdapter.
Dim adapter As New SqlDataAdapter()
'Set the UPDATE command and parameters.
adapter.UpdateCommand = New SqlCommand( _
"UPDATE Production.ProductCategory SET " _
& "Name=@Name WHERE ProductCategoryID=@ProdCatID;", _
connection)
adapter.UpdateCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.UpdateCommand.Parameters.Add("@ProdCatID", _
SqlDbType.Int, 4, " ProductCategoryID ")
adapter.UpdateCommand.UpdatedRowSource = _
UpdateRowSource.None
'Set the INSERT command and parameter.
adapter.InsertCommand = New SqlCommand( _
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);", _
connection)
adapter.InsertCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.InsertCommand.UpdatedRowSource = _
UpdateRowSource.None
'Set the DELETE command and parameter.
adapter.DeleteCommand = New SqlCommand( _
"DELETE FROM Production.ProductCategory " _
& "WHERE ProductCategoryID=@ProdCatID;", connection)
adapter.DeleteCommand.Parameters.Add("@ProdCatID", _
SqlDbType.Int, 4, " ProductCategoryID ")
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None
' Set the batch size.
adapter.UpdateBatchSize = batchSize
' Execute the update.
adapter.Update(dataTable)
End Using
End Sub
public static void BatchUpdate(DataTable dataTable,Int32 batchSize)
{
// Assumes GetConnectionString() returns a valid connection string.
string connectionString = GetConnectionString();
// Connect to the AdventureWorks database.
using (SqlConnection connection = new
SqlConnection(connectionString))
{
// Create a SqlDataAdapter.
SqlDataAdapter adapter = new SqlDataAdapter();
// Set the UPDATE command and parameters.
adapter.UpdateCommand = new SqlCommand(
"UPDATE Production.ProductCategory SET "
+ "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
connection);
adapter.UpdateCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.UpdateCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the INSERT command and parameter.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
connection);
adapter.InsertCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the DELETE command and parameter.
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Production.ProductCategory "
+ "WHERE ProductCategoryID=@ProdCatID;", connection);
adapter.DeleteCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the batch size.
adapter.UpdateBatchSize = batchSize;
// Execute the update.
adapter.Update(dataTable);
}
}
Kötegelt frissítéssel kapcsolatos események és hibák kezelése
A DataAdapter két frissítéssel kapcsolatos eseményt tartalmaz: RowUpdating és RowUpdated esemény. A ADO.NET korábbi verzióiban, amikor a kötegelt feldolgozás le van tiltva, a rendszer minden egyes feldolgozott sorhoz egyszer létrehozza ezeket az eseményeket.
RowUpdating a frissítés előtt jön létre, és RowUpdated az adatbázis-frissítés befejezése után jön létre.
Esemény viselkedésének változásai a Batch-frissítésekkel
Ha a kötegelt feldolgozás engedélyezve van, több sor is frissül egyetlen adatbázisműveletben. Ezért minden egyes köteghez csak egy RowUpdated esemény fordul elő, míg az RowUpdating esemény minden feldolgozott sorra vonatkozik. Ha a kötegelt feldolgozás le van tiltva, a két esemény egyenkénti összekapcsolással kerülnek aktiválásra, ahol egy RowUpdating esemény és egy RowUpdated esemény indul egy sorhoz, majd egy RowUpdating és egy RowUpdated esemény indul a következő sorhoz, amíg az összes sor feldolgozásra nem kerül.
Frissített sorok elérése
Amikor a kötegelt feldolgozás le van tiltva, a frissítendő sor az Row osztály RowUpdatedEventArgs tulajdonságával érhető el.
Amikor a kötegelt feldolgozás engedélyezve van, a rendszer egyetlen RowUpdated eseményt hoz létre több sor számára. Ezért az Row egyes sorok tulajdonságának értéke null.
RowUpdating események továbbra is generálódnak minden sorhoz. Az CopyToRows osztály metódusa RowUpdatedEventArgs lehetővé teszi a feldolgozott sorok elérését a sorokra mutató hivatkozások tömbbe másolásával. Ha nem dolgoznak fel sorokat, CopyToRows dob el egy ArgumentNullException. A RowCount tulajdonság használatával adja vissza a CopyToRows metódus meghívása előtt a feldolgozott sorok számát.
Adathibák kezelése
A kötegelt végrehajtás hatása megegyezik azzal, mintha minden egyes utasítást külön-külön hajtottak volna végre. Az utasítások végrehajtása abban a sorrendben történik, amelyben az utasítások hozzá lettek adva a köteghez. A hibák kezelése ugyanolyan módon történik kötegelt módban, mint amikor a kötegelt mód le van tiltva. Minden sor feldolgozása külön történik. Csak az adatbázisban sikeresen feldolgozott sorok frissülnek a megfelelő DataRow helyen.DataTable
Az adatszolgáltató és a háttéradatbázis-kiszolgáló határozza meg, hogy mely SQL-szerkezetek támogatottak a kötegelt végrehajtáshoz. Kivétel akkor léphet fel, ha egy nem támogatott utasítást nyújtanak be végrehajtásra.