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


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, UpdateCommandvagy 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 DataAdaptertársítva van, a DbCommandBuilder rendszer automatikusan létrehozza a InsertCommandnullhivatkozá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 RowStateModified: 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 DataAdapterautomatikus 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 CommandTextSelectCommand 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 SelectCommandaktuá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 CommandBuildermeghí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");  

Lásd még