Parancsok létrehozása CommandBuilders használatával
Ha a SelectCommand
tulajdonság dinamikusan van megadva futásidőben, például egy olyan lekérdezési eszközzel, amely a felhasználótól szöveges parancsot vesz igénybe, előfordulhat, hogy nem tudja megadni a megfelelőt InsertCommand
, UpdateCommand
vagy DeleteCommand
a tervezéskor. Ha a DataTable leképezések egyetlen adatbázistáblára vagy abból jönnek létre, az objektum használatával DbCommandBuilder automatikusan létrehozhatja a DeleteCommand
, InsertCommand
és UpdateCommand
a DbDataAdapter.
Minimális követelményként be kell állítania a tulajdonságot ahhoz, hogy az SelectCommand
automatikus parancslétrehozás működjön. A tulajdonság által SelectCommand
lekért táblaséma határozza meg az automatikusan létrehozott IN Standard kiadás RT, UPDATE és DELETE utasítások szintaxisát.
Az DbCommandBuilder IN Standard kiadás RT, UPDATE és DELETE SQL-parancsok létrehozásához szükséges metaadatok visszaadásához végre kell hajtania a parancsotSelectCommand
. Ennek eredményeképpen további utazásra van szükség az adatforráshoz, ami akadályozhatja a teljesítményt. Az optimális teljesítmény eléréséhez a parancsokat explicit módon adja meg ahelyett, hogy a DbCommandBuilder.
A SelectCommand
kulcsnak legalább egy elsődleges kulcsot vagy egyedi oszlopot is vissza kell adnia. Ha nincs jelen, a rendszer kivételt InvalidOperation
hoz létre, és a parancsok nem jönnek létre.
Ha egyhez DataAdapter
társítva van, a DbCommandBuilder rendszer automatikusan létrehozza a InsertCommand
nullhivatkozások esetén a , UpdateCommand
és DeleteCommand
a DataAdapter
tulajdonságokat. Ha már létezik tulajdonság Command
, a meglévőt Command
használja a rendszer.
A két vagy több tábla összekapcsolásával létrehozott adatbázisnézetek nem tekinthetők egyetlen adatbázistáblának. Ebben az esetben nem használhatja a DbCommandBuilder parancsok automatikus generálására; explicit módon kell megadnia a parancsokat. Az adatforrások frissítéseinek feloldására DataSet
szolgáló parancsok explicit beállításával kapcsolatos információkért lásd : Adatforrások frissítése DataAdapters használatával.
Előfordulhat, hogy a kimeneti paramétereket vissza szeretné képezni egy frissített sorba DataSet
. Az egyik gyakori feladat egy automatikusan létrehozott identitásmező vagy időbélyeg értékének lekérése az adatforrásból. A DbCommandBuilder program alapértelmezés szerint nem rendeli le a kimeneti paramétereket egy frissített sor oszlopaihoz. Ebben az esetben explicit módon kell megadnia a parancsot. Ha egy automatikusan létrehozott identitásmezőt egy beszúrt sor oszlopába szeretne visszaképezni, olvassa el az Identitás vagy számértékek beolvasása című témakört.
Automatikusan létrehozott parancsok szabályai
Az alábbi táblázat az automatikusan létrehozott parancsok létrehozásának szabályait mutatja be.
Parancs | Szabály |
---|---|
InsertCommand |
Beszúr egy sort az adatforrásba a táblázat összes sorához a következővel RowStateAdded: Beszúrja az összes frissíthető oszlop értékeit (de nem az olyan oszlopokat, mint az identitások, kifejezések vagy időbélyegek). |
UpdateCommand |
Frissítések az adatforrásban lévő sorokat a táblázat összes sorához a következővel RowState Modified: Frissítések az összes oszlop értékeit, kivéve a nem frissíthető oszlopokat, például identitásokat vagy kifejezéseket. Frissítések minden olyan sort, ahol az adatforrás oszlopértékei megegyeznek a sor elsődleges kulcsoszlop-értékeivel, és ahol az adatforrás többi oszlopa megegyezik a sor eredeti értékeivel. További információ: "Optimista egyidejűségi modell Frissítések és törlésekhez". |
DeleteCommand |
Törli az adatforrás sorait a tábla összes sorához a következővelDeleted: aRowState . Törli azokat a sorokat, ahol az oszlopértékek megegyeznek a sor elsődleges kulcs oszlopértékeivel, és ahol az adatforrás többi oszlopa megegyezik a sor eredeti értékével. További információ: "Optimista egyidejűségi modell Frissítések és törlésekhez". |
Optimista egyidejűségi modell Frissítések és törléshez
Az UPDATE és DELETE utasítások parancsainak automatikus generálására szolgáló logika optimista egyidejűségen alapul, vagyis a rekordok nem zárolva vannak szerkesztésre, és más felhasználók vagy folyamatok bármikor módosíthatják őket. Mivel egy rekord a Standard kiadás LECT utasításból való visszaadása után módosítható, de az UPDATE vagy DELETE utasítás kiadása előtt az automatikusan létrehozott UPDATE vagy DELETE utasítás tartalmaz egy WHERE záradékot, amely azt határozza meg, hogy egy sor csak akkor frissül, ha az összes eredeti értéket tartalmazza, és nem törölték az adatforrásból. Ez az új adatok felülírásának elkerülése érdekében történik. Ha egy automatikusan létrehozott frissítés olyan sort próbál frissíteni, amely törölve lett, vagy amely nem tartalmazza a DataSetbenne található eredeti értékeket, a parancs semmilyen rekordot nem érint, és DBConcurrencyException a rendszer egy műveletet hajt végre.
Ha azt szeretné, hogy az UPDATE vagy a DELETE az eredeti értékektől függetlenül befejeződjön, explicit módon be kell állítania a UpdateCommand
parancsot, DataAdapter
és nem kell automatikus parancslétrehozásra támaszkodnia.
Az automatikus parancsgenerálási logika korlátozásai
Az automatikus parancslétrehozásra az alábbi korlátozások vonatkoznak.
Nem kapcsolódó táblák csak
Az automatikus parancsgenerálási logika in Standard kiadás RT, UPDATE vagy DELETE utasításokat hoz létre önálló táblákhoz anélkül, hogy figyelembe veszi az adatforrás más tábláihoz való kapcsolatokat. Ennek eredményeképpen előfordulhat, hogy egy olyan oszlop módosításainak elküldése sikertelen Update
lesz, amely részt vesz az adatbázis idegenkulcs-korlátozásában. A kivétel elkerülése érdekében ne használja az DbCommandBuilder idegenkulcs-korlátozásban érintett oszlopok frissítéséhez; ehelyett explicit módon adja meg a művelet végrehajtásához használt utasításokat.
Táblázat- és oszlopnevek
Az automatikus parancsgenerálási logika akkor is meghiúsulhat, ha az oszlopnevek vagy táblázatnevek speciális karaktereket, például szóközöket, pontokat, idézőjeleket vagy egyéb nemnalfanumerikus karaktereket tartalmaznak, még akkor is, ha szögletes zárójelekkel vannak elválasztva. A szolgáltatótól függően előfordulhat, hogy az QuotePrefix és az QuoteSuffix paraméterek beállítása lehetővé teszi a létrehozási logika számára a szóközök feldolgozását, de nem tudja feloldani a speciális karaktereket. A catalog.schema.table formátumú teljes táblanevek támogatottak.
SQL-utasítás automatikus létrehozása a CommandBuilder használatával
Az SQL-utasítások DataAdapter
automatikus létrehozásához először állítsa be a SelectCommand
tulajdonságot DataAdapter
, majd hozzon létre egy CommandBuilder
objektumot, és adja meg argumentumként, DataAdapter
hogy a program automatikusan CommandBuilder
létrehoz-e SQL-utasításokat.
' Assumes that connection is a valid SqlConnection object
' inside of a Using block.
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM dbo.Customers", connection)
Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter)
builder.QuotePrefix = "["
builder.QuoteSuffix = "]"
// Assumes that connection is a valid SqlConnection object
// inside of a using block.
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
A SelectCommand módosítása
Ha az CommandText
SelectCommand
IN Standard kiadás RT, UPDATE vagy DELETE parancsok automatikus létrehozása után módosítja a parancsokat, kivétel léphet fel. Ha a módosított SelectCommand.CommandText
sémaadatok nem összhangban vannak a SelectCommand.CommandText
beszúrási, frissítési vagy törlési parancsok automatikus létrehozásakor használt adatokkal, a DataAdapter.Update
metódus jövőbeli hívásai megpróbálhatják elérni azokat az oszlopokat, amelyek már nem léteznek az SelectCommand
aktuális táblában, és kivételt okoznak.
A parancsok automatikus generálásához használt CommandBuilder
sémainformációkat a parancs metódusának CommandBuilder
meghívásával RefreshSchema
frissítheti.
Ha tudni szeretné, hogy melyik parancs lett automatikusan létrehozva, az objektum , GetUpdateCommand
és GetDeleteCommand
metódusok CommandBuilder
használatávalGetInsertCommand
, valamint a CommandText
társított parancs tulajdonságának ellenőrzésével szerezheti be az automatikusan létrehozott parancsra mutató hivatkozást.
Az alábbi példakód az automatikusan létrehozott frissítési parancsot írja a konzolra.
Console.WriteLine(builder.GetUpdateCommand().CommandText)
Console.WriteLine(builder.GetUpdateCommand().CommandText);
Az alábbi példa újra létrehozza a Customers
táblát az custDS
adathalmazban. A Rendszer meghívja a RefreshSchema metódust az automatikusan létrehozott parancsok frissítésére ezzel az új oszlopinformációval.
' Assumes an open SqlConnection and SqlDataAdapter inside of a Using block.
adapter.SelectCommand.CommandText = _
"SELECT CustomerID, ContactName FROM dbo.Customers"
builder.RefreshSchema()
custDS.Tables.Remove(custDS.Tables("Customers"))
adapter.Fill(custDS, "Customers")
// Assumes an open SqlConnection and SqlDataAdapter inside of a using block.
adapter.SelectCommand.CommandText =
"SELECT CustomerID, ContactName FROM dbo.Customers";
builder.RefreshSchema();
custDS.Tables.Remove(custDS.Tables["Customers"]);
adapter.Fill(custDS, "Customers");