Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wanneer de SelectCommand eigenschap dynamisch wordt opgegeven tijdens runtime, zoals via een queryprogramma dat een tekstuele opdracht van de gebruiker gebruikt, kunt u mogelijk niet de juiste InsertCommand, UpdateCommandof DeleteCommand tijdens het ontwerptijd opgeven. Als uw DataTable wordt toegewezen aan of gegenereerd uit één databasetabel, kunt u profiteren van het DbCommandBuilder object door automatisch de DeleteCommand, InsertCommand en UpdateCommand van de DbDataAdapter te genereren.
Als minimale vereiste moet u de SelectCommand eigenschap instellen om automatische opdrachtgeneratie te laten werken. Het tabelschema dat door de SelectCommand eigenschap wordt opgehaald, bepaalt de syntaxis van de automatisch gegenereerde instructies INSERT, UPDATE en DELETE.
DbCommandBuilder moet de SelectCommand uitvoeren om de metagegevens te retourneren die nodig zijn om de SQL-commando's INSERT, UPDATE en DELETE te maken. Als gevolg hiervan is een extra reis naar de gegevensbron nodig en kan dit de prestaties belemmeren. Als u optimale prestaties wilt bereiken, geeft u uw opdrachten expliciet op in plaats van de DbCommandBuilder.
De SelectCommand sleutel moet ook ten minste één primaire sleutel of unieke kolom retourneren. Als er geen aanwezig zijn, wordt er een InvalidOperation uitzondering gegenereerd en worden de opdrachten niet gegenereerd.
Wanneer geassocieerd met een DataAdapter, genereert de DbCommandBuilder automatisch de InsertCommand, UpdateCommand, en DeleteCommand eigenschappen van het DataAdapter als ze null-verwijzingen zijn. Als er al een Command eigenschap bestaat, wordt de bestaande Command gebruikt.
Databaseweergaven die worden gemaakt door twee of meer tabellen samen te voegen, worden niet beschouwd als één databasetabel. In dit geval kunt u de DbCommandBuilder opdracht niet gebruiken om automatisch opdrachten te genereren. U moet uw opdrachten expliciet opgeven. Zie voor informatie over het expliciet instellen van opdrachten om updates naar een DataSet terug te voeren naar de gegevensbron, Gegevensbronnen bijwerken met DataAdapters.
Mogelijk wilt u uitvoerparameters weer toewijzen aan de bijgewerkte rij van een DataSet. Een veelvoorkomende taak is het ophalen van de waarde van een automatisch gegenereerd identiteitsveld of tijdstempel uit de gegevensbron. De DbCommandBuilder uitvoerparameters worden standaard niet toegewezen aan kolommen in een bijgewerkte rij. In dit geval moet u uw opdracht expliciet opgeven. Zie Identiteits- of autonummeringswaarden ophalen voor een voorbeeld van het toewijzen van een automatisch gegenereerd identiteitsveld aan een kolom van een ingevoegde rij.
Regels voor automatisch gegenereerde opdrachten
In de volgende tabel ziet u de regels voor hoe automatisch gegenereerde opdrachten worden gegenereerd.
| Opdracht | Regel |
|---|---|
InsertCommand |
Er wordt een rij toegevoegd aan de gegevensbron voor alle rijen in de tabel die een RowState van Added hebben. Hiermee worden waarden ingevoegd voor alle kolommen die kunnen worden bijgewerkt (maar niet voor kolommen zoals identiteiten, expressies of tijdstempels). |
UpdateCommand |
Werkt rijen bij in de gegevensbron voor alle rijen in de tabel met een RowState van Modified. Hiermee worden de waarden van alle kolommen bijgewerkt, met uitzondering van kolommen die niet kunnen worden bijgewerkt, zoals identiteiten of expressies. Hiermee worden alle rijen bijgewerkt waarbij de kolomwaarden in de gegevensbron overeenkomen met de primaire-sleutelkolomwaarden van de rij en waar de resterende kolommen in de gegevensbron overeenkomen met de oorspronkelijke waarden van de rij. Zie 'Optimistisch gelijktijdigheidsmodel voor updates en verwijderingen' verderop in dit onderwerp voor meer informatie. |
DeleteCommand |
Hiermee verwijdert u rijen in de gegevensbron voor alle rijen in de tabel waarvan RowState gelijk is aan Deleted. Hiermee verwijdert u alle rijen waarin de kolomwaarden overeenkomen met de primaire-sleutelkolomwaarden van de rij en waar de resterende kolommen in de gegevensbron overeenkomen met de oorspronkelijke waarden van de rij. Zie 'Optimistisch gelijktijdigheidsmodel voor updates en verwijderingen' verderop in dit onderwerp voor meer informatie. |
Optimistisch gelijktijdigheidsmodel voor updates en verwijderingen
De logica voor het automatisch genereren van opdrachten voor UPDATE- en DELETE-instructies is gebaseerd op optimistische gelijktijdigheid. Records zijn dus niet vergrendeld voor bewerking en kunnen op elk gewenst moment worden gewijzigd door andere gebruikers of processen. Omdat een record kan zijn gewijzigd nadat deze is geretourneerd uit de SELECT-instructie, maar voordat de INSTRUCTIE UPDATE of DELETE wordt uitgegeven, bevat de automatisch gegenereerde INSTRUCTIE UPDATE of DELETE een WHERE-component, waarbij wordt opgegeven dat een rij alleen wordt bijgewerkt als deze alle oorspronkelijke waarden bevat en niet uit de gegevensbron is verwijderd. Dit wordt gedaan om te voorkomen dat nieuwe gegevens worden overschreven. Wanneer een automatisch gegenereerde update probeert een rij bij te werken die is verwijderd of die niet de oorspronkelijke waarden bevat in de DataSet, heeft de opdracht geen invloed op records en wordt er een DBConcurrencyException gegenereerd.
Als u wilt dat de UPDATE of DELETE wordt voltooid, ongeacht de oorspronkelijke waarden, moet u expliciet UpdateCommand instellen voor het DataAdapter en niet afhankelijk zijn van het automatisch genereren van opdrachten.
Beperkingen van automatische opdrachtgeneratielogica
De volgende beperkingen gelden voor het automatisch genereren van opdrachten.
Alleen niet-gerelateerde tabellen
Met de logica voor het automatisch genereren van opdrachten worden INSERT-, UPDATE- of DELETE-instructies gegenereerd voor zelfstandige tabellen zonder rekening te houden met relaties met andere tabellen in de gegevensbron. Als gevolg hiervan kan het gebeuren dat er een fout optreedt bij het aanroepen van de functie Update om wijzigingen in te dienen voor een kolom die deelneemt aan een vreemde-sleutelbeperking in de database. Om deze uitzondering te vermijden, gebruik DbCommandBuilder niet voor het bijwerken van kolommen die betrokken zijn bij een beperking voor vreemde sleutel; specificeer in plaats daarvan expliciet de instructies voor de bewerking.
Tabel- en kolomnamen
Automatische logica voor het genereren van opdrachten kan mislukken als kolomnamen of tabelnamen speciale tekens bevatten, zoals spaties, punten, aanhalingstekens of andere niet-aanhalingstekens, zelfs als deze worden gescheiden door vierkante haken. Afhankelijk van de provider kan het instellen van de parameters QuotePrefix en QuoteSuffix de generatielogica in staat stellen om spaties te verwerken, maar speciale tekens kunnen niet worden ontsnapt. Volledig gekwalificeerde tabelnamen in de vorm van catalog.schema.table worden ondersteund.
De CommandBuilder gebruiken om automatisch een SQL-instructie te genereren
Als u automatisch SQL-instructies voor een DataAdapter wilt genereren, stelt u eerst de SelectCommand eigenschap van de DataAdapter in, vervolgens maakt u een CommandBuilder object en specificeert u als argument de DataAdapter waarvoor de CommandBuilder automatisch SQL-instructies genereert.
' 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 = "]";
De SelectCommand wijzigen
Als u de CommandText van de SelectCommand wijzigt nadat de INSERT-, UPDATE- of DELETE-opdrachten automatisch zijn gegenereerd, kan er een uitzondering optreden. Als de gewijzigde SelectCommand.CommandText schema-informatie bevat die niet overeenkomt met de SelectCommand.CommandText waarmee de invoeg-, bijwerk- of verwijderopdrachten automatisch gegenereerd werden, kunnen toekomstige aanroepen naar de DataAdapter.Update-methode proberen toegang te krijgen tot kolommen die niet meer bestaan in de huidige tabel waarnaar de SelectCommand verwijst, waardoor er een uitzondering wordt gegenereerd.
U kunt de schema-informatie vernieuwen die wordt gebruikt door het CommandBuilder voor automatisch genereren van opdrachten door de RefreshSchema methode van de CommandBuilder aan te roepen.
Als u wilt weten welke opdracht automatisch is gegenereerd, kunt u een verwijzing verkrijgen naar de automatisch gegenereerde opdrachten met behulp van de GetInsertCommand, GetUpdateCommanden GetDeleteCommand methoden van het CommandBuilder object en het controleren van de CommandText eigenschap van de bijbehorende opdracht.
Het volgende codevoorbeeld schrijft naar de console de updateopdracht die automatisch is gegenereerd.
Console.WriteLine(builder.GetUpdateCommand().CommandText)
Console.WriteLine(builder.GetUpdateCommand().CommandText);
In het volgende voorbeeld wordt de Customers tabel in de custDS gegevensset opnieuw gemaakt. De methode RefreshSchema wordt aangeroepen om de automatisch gegenereerde opdrachten met deze nieuwe kolomgegevens te vernieuwen.
' 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");