Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Scott Mitchell
In früheren Tutorials haben wir gelernt, wie das ObjectDataSource-Steuerelement das Einfügen, Aktualisieren und Löschen von Daten ermöglicht. Das SqlDataSource-Steuerelement unterstützt dieselben Vorgänge, aber der Ansatz unterscheidet sich, und in diesem Lernprogramm wird gezeigt, wie Die SqlDataSource zum Einfügen, Aktualisieren und Löschen von Daten konfiguriert wird.
Einleitung
Wie in einer Übersicht über das Einfügen, Aktualisieren und Löschen erläutert, bietet das GridView-Steuerelement integrierte Aktualisierungs- und Löschfunktionen, während die DetailsView- und FormView-Steuerelemente Unterstützung zum Einfügen zusammen mit Bearbeitungs- und Löschfunktionen umfassen. Diese Datenänderungsfunktionen können direkt an ein Datenquellensteuerelement angeschlossen werden, ohne dass eine Codezeile geschrieben werden muss. Eine Übersicht über das Einfügen, Aktualisieren und Löschen, untersucht unter Nutzung der ObjectDataSource, um das Einfügen, Aktualisieren und Löschen mit den Steuerelementen GridView, DetailsView und FormView zu erleichtern. Alternativ kann die SqlDataSource anstelle der ObjectDataSource verwendet werden.
Erinnern Sie sich daran, dass wir mit der ObjectDataSource zum Unterstützen von Einfügen, Aktualisieren und Löschen die Methoden der Objektebene angeben mussten, die für diese Aktionen aufgerufen werden sollten. Mit dem SqlDataSource müssen wir INSERT
, UPDATE
und DELETE
SQL-Anweisungen (oder gespeicherte Prozeduren) bereitstellen, die ausgeführt werden sollen. Wie wir in diesem Lernprogramm sehen, können diese Anweisungen manuell erstellt oder automatisch vom Assistenten zum Konfigurieren der Datenquelle von SqlDataSource generiert werden.
Hinweis
Da wir bereits über die Funktionen zum Einfügen, Bearbeiten und Löschen der GridView-, DetailsView- und FormView-Steuerelemente gesprochen haben, konzentriert sich dieses Lernprogramm auf die Konfiguration des SqlDataSource-Steuerelements zur Unterstützung dieser Vorgänge. Wenn Sie die Implementierung dieser Features in GridView, DetailsView und FormView auffrischen müssen, kehren Sie zu den Lernprogrammen "Bearbeiten", "Einfügen" und "Löschen von Daten" zurück, beginnend mit "Übersicht über Einfügen", "Aktualisieren" und "Löschen".
Schritt 1: Festlegen von INSERT-, UPDATE- und DELETE-Anweisungen
Wie wir in den letzten beiden Lernprogrammen gesehen haben, müssen wir zwei Eigenschaften festlegen, um Daten aus einem SqlDataSource-Steuerelement abzurufen:
-
ConnectionString
, die angibt, an welche Datenbank die Abfrage gesendet werden soll, und -
SelectCommand
, die die ad-hoc SQL-Anweisung oder den Namen der gespeicherten Prozedur angibt, die ausgeführt werden soll, um die Ergebnisse zurückzugeben.
Bei SelectCommand
Werten mit Parametern werden die Parameterwerte über die SqlDataSource-Auflistung SelectParameters
angegeben und können hartcodierte Werte, allgemeine Parameterquellwerte (Abfragezeichenfolgenfelder, Sitzungsvariablen, Websteuerelementwerte usw.) enthalten oder programmgesteuert zugewiesen werden. Wenn die Methode des SqlDataSource-Steuerelements Select()
programmgesteuert oder automatisch von einem Datenwebsteuerelement aufgerufen wird, wird eine Verbindung zur Datenbank hergestellt, die Parameterwerte werden der Abfrage zugewiesen, und der Befehl wird an die Datenbank gesendet. Die Ergebnisse werden dann je nach Wert der Eigenschaft des Steuerelements DataSourceMode
als DataSet oder DataReader zurückgegeben.
Zusammen mit der Auswahl von Daten kann das SqlDataSource-Steuerelement verwendet werden, um Daten einzufügen, zu aktualisieren und zu löschen, indem INSERT
, UPDATE
und DELETE
SQL-Anweisungen auf die gleiche Weise bereitgestellt werden. Weisen Sie einfach den Eigenschaften InsertCommand
, UpdateCommand
und DeleteCommand
die auszuführenden SQL-Anweisungen INSERT
, UPDATE
, und DELETE
zu. Wenn die Anweisungen Parameter haben (wie es fast immer der Fall ist), fügen Sie sie in die InsertParameters
, UpdateParameters
und DeleteParameters
Sammlungen ein.
Nachdem ein InsertCommand
, UpdateCommand
, oder DeleteCommand
Wert angegeben worden ist, wird die Option "Einfügen aktivieren", "Bearbeiten aktivieren" oder "Löschen aktivieren" im Smarttag des jeweiligen Daten-Websteuerungsmöglichkeiten verfügbar. Um dies zu veranschaulichen, nehmen wir ein Beispiel von der Querying.aspx
Seite, die wir im Lernprogramm zum Abfragen von Daten mit dem SqlDataSource-Steuerelement erstellt haben, und erweitern wir es, um Löschfunktionen einzuschließen.
Öffnen Sie zunächst die InsertUpdateDelete.aspx
und Querying.aspx
Seiten im SqlDataSource
Ordner. Wählen Sie im Designer auf der Querying.aspx
Seite die SqlDataSource und GridView vom ersten Beispiel (die ProductsDataSource
und GridView1
Steuerelemente) aus. Nachdem Sie die beiden Steuerelemente ausgewählt haben, wechseln Sie zum Menü "Bearbeiten", und wählen Sie "Kopieren" aus (oder drücken Sie einfach STRG+C). Als Nächstes wechseln Sie zum Designer von InsertUpdateDelete.aspx
und fügen die Steuerelemente ein. Nachdem Sie die beiden Steuerelemente zu InsertUpdateDelete.aspx
verschoben haben, testen Sie die Seite in einem Browser. Sie sollten die Werte der ProductID
, ProductName
und UnitPrice
Spalten für alle Datensätze in der Products
Datenbanktabelle sehen.
Abbildung 1: Alle Produkte sind aufgelistet, sortiert nach ProductID
(Klicken Sie hier, um das Bild mit voller Größe anzuzeigen)
Hinzufügen der DeleteCommand- und DeleteParameters-Eigenschaften von SqlDataSource
An diesem Punkt haben wir eine SqlDataSource, die einfach alle Datensätze aus der Products
Tabelle und eine GridView zurückgibt, die diese Daten rendert. Unser Ziel ist es, dieses Beispiel zu erweitern, damit der Benutzer Produkte über gridView löschen kann. Dazu müssen wir Werte für die SqlDataSource-Steuerelemente DeleteCommand
und DeleteParameters
-Eigenschaften angeben und dann das GridView so konfigurieren, dass das Löschen unterstützt wird.
Die DeleteCommand
Eigenschaften und DeleteParameters
Eigenschaften können auf verschiedene Arten angegeben werden:
- Durch die deklarative Syntax
- Aus dem Fenster "Eigenschaften" im Designer
- Über das Fenster "Benutzerdefinierte SQL-Anweisung oder gespeicherte Prozedur angeben" im Assistenten zur Datenquellenkonfiguration
- Über die Schaltfläche "Erweitert" im Bildschirm "Spalten aus einer Ansichts-Tabelle angeben" des Assistenten zur Konfiguration der Datenquelle wird tatsächlich automatisch die
DELETE
SQL-Anweisung und die Parametersammlung generiert, die in den EigenschaftenDeleteCommand
undDeleteParameters
verwendet wird.
Wir untersuchen, wie die DELETE
Anweisung in Schritt 2 automatisch erstellt wird. Lassen Sie uns nun das Eigenschaftenfenster im Designer verwenden, obwohl der Assistent zum Konfigurieren von Datenquellen oder die deklarative Syntaxoption genauso gut funktioniert.
Klicken Sie im Designer auf InsertUpdateDelete.aspx
die ProductsDataSource
SqlDataSource, und rufen Sie dann das Fenster "Eigenschaften" auf (wählen Sie im Menü "Ansicht" die Option "Eigenschaften" aus, oder drücken Sie einfach F4). Wählen Sie die DeleteQuery-Eigenschaft aus, die eine Reihe von Auslassungspunkten anzeigt.
Abbildung 2: Auswählen der DeleteQuery-Eigenschaft aus dem Eigenschaftenfenster
Hinweis
Die SqlDataSource verfügt nicht über eine DeleteQuery-Eigenschaft. Vielmehr ist DeleteQuery eine Kombination aus den Eigenschaften DeleteCommand
und DeleteParameters
und wird nur im Eigenschaftenfenster aufgelistet, wenn das Fenster im Entwurfmodus angezeigt wird. Wenn Sie sich das Eigenschaftenfenster in der Quellansicht ansehen, finden Sie stattdessen die DeleteCommand
Eigenschaft.
Klicken Sie auf die Ellipse in der DeleteQuery-Eigenschaft, um das Dialogfeld "Befehl und Parameter-Editor" anzuzeigen (siehe Abbildung 3). In diesem Dialogfeld können Sie die DELETE
SQL-Anweisung angeben und die Parameter angeben. Geben Sie die folgende Abfrage in das DELETE
Befehlstextfeld ein (bei Bedarf entweder manuell oder mit dem Abfrage-Generator):
DELETE FROM Products
WHERE ProductID = @ProductID
Klicken Sie als Nächstes auf die Schaltfläche "Parameter aktualisieren", um den @ProductID
Parameter zur liste der folgenden Parameter hinzuzufügen.
@ProductID Parameter, der zu den Parametern des DELETE-Befehls hinzugefügt wurde." />
Abbildung 3: Auswählen der DeleteQuery-Eigenschaft aus dem Eigenschaftenfenster (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Geben Sie keinen Wert für diesen Parameter an (behalten Sie die Parameterquelle bei None bei). Sobald wir die Löschunterstützung zu GridView hinzugefügt haben, gibt gridView diesen Parameterwert automatisch an, wobei der Wert der DataKeys
Auflistung für die Zeile verwendet wird, auf die die Schaltfläche "Löschen" geklickt wurde.
Hinweis
Der in der DELETE
Abfrage verwendete Parametername muss mit dem Namen des DataKeyNames
Werts in GridView, DetailsView oder FormView übereinstimmen. Das heißt, der Parameter in DELETE
Anweisung wird absichtlich @ProductID
benannt (statt z. B. @ID
), da der Primärschlüsselname in der Tabelle "Products" (und daher der DataKeyNames-Wert in der GridView) ist ProductID
.
Wenn der Parametername und DataKeyNames
-wert nicht übereinstimmen, kann gridView den Parameter nicht automatisch dem Wert aus der DataKeys
Auflistung zuweisen.
Nachdem Sie die löschbezogenen Informationen in das Dialogfeld "Befehl" und "Parameter-Editor" eingegeben haben, klicken Sie auf "OK", und wechseln Sie zur Quellansicht, um das resultierende deklarative Markup zu untersuchen:
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]"
DeleteCommand="DELETE FROM Products WHERE ProductID = @ProductID">
<DeleteParameters>
<asp:Parameter Name="ProductID" />
</DeleteParameters>
</asp:SqlDataSource>
Beachten Sie das Hinzufügen der DeleteCommand
Eigenschaft sowie des <DeleteParameters>
Abschnitts und des Parameter-Objekts mit dem Namen productID
.
Konfigurieren der GridView zum Aktivieren der Löschfunktion
Nachdem die DeleteCommand
Eigenschaft hinzugefügt wurde, enthält das Smarttag "GridView" jetzt die Option "Löschen aktivieren". Fahren Sie fort, und aktivieren Sie dieses Kontrollkästchen. Wie in einer Übersicht über das Einfügen, Aktualisieren und Löschen beschrieben, bewirkt dies, dass die GridView ein CommandField mit seiner ShowDeleteButton
-Eigenschaft auf true
anzeigt. Wie in Abbildung 4 dargestellt, ist beim Besuch der Seite über einen Browser eine Schaltfläche "Löschen" enthalten. Testen Sie diese Seite, indem Sie einige Produkte löschen.
Abbildung 4: Jede GridView-Zeile enthält jetzt eine Schaltfläche "Löschen" (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Beim Klicken auf eine Schaltfläche "Löschen" tritt ein Postback auf, das GridView weist den Parameter dem ProductID
Wert des DataKeys
Sammlungswerts für die Zeile zu, auf deren Schaltfläche "Löschen" geklickt wurde, und ruft die SqlDataSource-Methode Delete()
auf. Das SqlDataSource-Steuerelement stellt dann eine Verbindung mit der Datenbank und führt die DELETE
Anweisung aus. Das GridView-Objekt wird dann erneut an die SqlDataSource gebunden, und der aktuelle Satz von Produkten wird wieder angezeigt (der den soeben gelöschten Datensatz nicht mehr enthält).
Hinweis
Da gridView seine DataKeys
Auflistung verwendet, um die SqlDataSource-Parameter aufzufüllen, ist es wichtig, dass die GridView-Eigenschaft DataKeyNames
auf die Spalten festgelegt wird, die den Primärschlüssel darstellen und dass die SqlDataSource s SelectCommand
diese Spalten zurückgibt. Außerdem ist es wichtig, dass der Parametername in der SqlDataSource DeleteCommand
auf @ProductID
gesetzt wird. Wenn die DataKeyNames
-Eigenschaft nicht festgelegt ist oder der Parameter nicht mit @ProductsID
benannt ist, führt ein Klick auf die Schaltfläche "Löschen" zu einem Postback, löscht jedoch keinen Datensatz.
Abbildung 5 zeigt diese Interaktion grafisch. Weitere Informationen zur Ereigniskette, die mit dem Einfügen, Aktualisieren und Löschen eines Datenwebsteuerelements verknüpft sind, finden Sie unter " Untersuchen der Ereignisse im Zusammenhang mit Einfügen, Aktualisieren und Löschen aus einem Datenwebsteuerelement".
Abbildung 5: Klicken auf die Schaltfläche "Löschen" in "GridView" ruft die SqlDataSource-Methode Delete()
auf.
Schritt 2: Automatisches Generieren der INSERT-, UPDATE- und DELETE-Anweisungen
Wie in Schritt 1 untersucht, können die SQL-Anweisungen INSERT
, UPDATE
und DELETE
über das Eigenschaftenfenster oder die deklarative Syntax des Steuerelements angegeben werden. Dieser Ansatz erfordert jedoch, dass wir die SQL-Anweisungen manuell manuell schreiben, was monoton und fehleranfällig sein kann. Glücklicherweise bietet der Assistent "Datenquelle konfigurieren" eine Option, mit der die Anweisungen INSERT
, UPDATE
und DELETE
automatisch generiert werden können, wenn Sie auf dem Bildschirm 'Spalten aus einer Ansichtstabelle auswählen' arbeiten.
Sehen wir uns diese Option für die automatische Generierung an. Fügen Sie dem Designer das DetailsView in InsertUpdateDelete.aspx
hinzu und legen Sie seine ID
-Eigenschaft auf ManageProducts
fest. Wählen Sie als Nächstes aus dem Smarttag "DetailsView" aus, eine neue Datenquelle zu erstellen und eine SqlDataSource mit dem Namen ManageProductsDataSource
zu erstellen.
Abbildung 6: Erstellen einer neuen SqlDataSource namens ManageProductsDataSource
(Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Wählen Sie im Assistenten "Datenquelle konfigurieren" die NORTHWINDConnectionString
Verbindungszeichenfolge aus, und klicken Sie auf "Weiter". Von dem Bildschirm "Konfigurieren der Anweisung auswählen" lassen Sie die Optionsschaltfläche "Spalten aus einer Tabelle oder Ansicht angeben" ausgewählt und wählen Sie die Products
Tabelle aus der Dropdownliste aus. Wählen Sie die Spalten ProductID
, ProductName
, UnitPrice
und Discontinued
aus der Kontrollkästchenliste aus.
Abbildung 7: Verwenden der Products
Tabelle, Zurückgeben von ProductID
, ProductName
, UnitPrice
und Discontinued
Spalten (Klicken, um das Bild in voller Größe anzuzeigen)
Um automatisch INSERT
, UPDATE
und DELETE
Anweisungen basierend auf der ausgewählten Tabelle und den Spalten zu generieren, klicken Sie auf die Schaltfläche "Erweitert" und aktivieren Sie das Kontrollkästchen "Generieren INSERT
, UPDATE
und DELETE
Anweisungen".
Abbildung 8: Aktivieren Sie das Kontrollkästchen für die Anweisungen "Generieren INSERT
", "UPDATE
" und "DELETE
".
Das Kontrollkästchen "Generieren INSERT
, UPDATE
und DELETE
Anweisungen" kann nur aktiviert werden, wenn die ausgewählte Tabelle über einen Primärschlüssel verfügt und die Primärschlüsselspalte (oder Spalten) in der Liste der zurückgegebenen Spalten enthalten sind. Das Kontrollkästchen "Optimistische Parallelität verwenden", das auswählbar wird, nachdem das Kontrollkästchen "INSERT
, UPDATE
und DELETE
Anweisungen erzeugen" aktiviert wurde, erweitert die WHERE
Klauseln in den resultierenden UPDATE
und DELETE
Anweisungen, um optimistische Parallelitätssteuerung bereitzustellen. Lassen Sie dieses Kontrollkästchen vorerst deaktiviert; Wir werden die optimistische Parallelität mit dem SqlDataSource-Steuerelement im nächsten Lernprogramm untersuchen.
Aktivieren Sie das Kontrollkästchen "Generieren von INSERT
, UPDATE
und DELETE
-Anweisungen". Klicken Sie auf "Bestätigen", um zum Bildschirm zur Konfiguration der Select-Anweisung zurückzukehren, dann auf "Weiter" und schließlich auf "Fertigstellen", um den Assistenten zur Konfiguration der Datenquelle abzuschließen. Nach Abschluss des Assistenten fügt Visual Studio BoundFields für die ProductID
, ProductName
und UnitPrice
Spalten sowie ein CheckBoxField für die Discontinued
Spalte zur DetailsView hinzu. Aktivieren Sie im Smarttag "DetailsView" die Option "Seitennummerierung aktivieren", damit der Benutzer, der diese Seite besucht, die Produkte durchblättern kann. Löschen Sie außerdem die Eigenschaften Width
und Height
des DetailsView.
Beachten Sie, dass das Smarttag die Optionen "Einfügen aktivieren", "Bearbeiten aktivieren" und "Löschen aktivieren" verfügbar hat. Dies liegt daran, dass die SqlDataSource Werte für ihre InsertCommand
, UpdateCommand
und DeleteCommand
enthält, wie die folgende deklarative Syntax zeigt.
<asp:DetailsView ID="ManageProducts" runat="server" AllowPaging="True"
AutoGenerateRows="False" DataKeyNames="ProductID"
DataSourceID="ManageProductsDataSource" EnableViewState="False">
<Fields>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="ManageProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
DeleteCommand=
"DELETE FROM [Products] WHERE [ProductID] = @ProductID"
InsertCommand=
"INSERT INTO [Products] ([ProductName], [UnitPrice], [Discontinued])
VALUES (@ProductName, @UnitPrice, @Discontinued)"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued]
FROM [Products]"
UpdateCommand=
"UPDATE [Products] SET [ProductName] = @ProductName,
[UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued
WHERE [ProductID] = @ProductID">
<DeleteParameters>
<asp:Parameter Name="ProductID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
<asp:Parameter Name="ProductID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
</InsertParameters>
</asp:SqlDataSource>
Beachten Sie, dass das SqlDataSource-Steuerelement Werte für seine InsertCommand
, UpdateCommand
und DeleteCommand
Eigenschaften automatisch festgelegt hat. Der Satz von Spalten, der in den Eigenschaften InsertCommand
und UpdateCommand
referenziert wird, basiert auf denen im SELECT
-Statement. Das heißt, es gibt nicht jede Spalte Produkte in der InsertCommand
und UpdateCommand
, sondern nur die Spalten, die in der SelectCommand
angegeben sind, mit Ausnahme von ProductID
, die ausgelassen wird, weil es sich um eine IDENTITY
-Spalte handelt, deren Wert beim Bearbeiten nicht geändert werden kann und die beim Einfügen automatisch zugewiesen wird. Darüber hinaus gibt es für jeden Parameter in den InsertCommand
, UpdateCommand
und DeleteCommand
Eigenschaften entsprechende Parameter in den InsertParameters
, UpdateParameters
, und DeleteParameters
Auflistungen.
Um die DetailsView-Datenänderungsfeatures zu aktivieren, überprüfen Sie die Optionen "Einfügen aktivieren", "Bearbeiten aktivieren" und "Löschen aktivieren" in seinem Smarttag. Dadurch wird ein CommandField hinzugefügt, dessen Eigenschaften mit ShowInsertButton
, ShowEditButton
, und ShowDeleteButton
auf true
festgelegt sind.
Besuchen Sie die Seite in einem Browser, und notieren Sie sich die Schaltflächen "Bearbeiten", "Löschen" und "Neu", die in der DetailsView enthalten sind. Wenn Sie auf die Schaltfläche "Bearbeiten" klicken, wird die DetailsView in den Bearbeitungsmodus umgewandelt, in dem jedes BoundField angezeigt wird, dessen ReadOnly
Eigenschaft als TextBox festgelegt false
ist (standard), und das CheckBoxField als Kontrollkästchen.
Abbildung 9: Die Standardbearbeitungsschnittstelle für DetailsView (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Ebenso können Sie das aktuell ausgewählte Produkt löschen oder dem System ein neues Produkt hinzufügen. Da die InsertCommand
Anweisung nur mit den ProductName
, UnitPrice
und Discontinued
Spalten funktioniert, haben die anderen Spalten entweder NULL
oder ihren Standardwert, der von der Datenbank beim Einfügen zugewiesen wird. Genau wie bei ObjectDataSource tritt beim Ausführen der InsertCommand
Anweisung ein SQL-Fehler auf, wenn keine NULL
Datenbanktabellenspalten vorhanden sind, die nicht zulassen INSERT
und keinen Standardwert aufweisen.
Hinweis
Die Einfüge- und Bearbeitungsschnittstellen von DetailsView fehlen jeglicher Art von Anpassung oder Überprüfung. Um Validierungssteuerelemente hinzuzufügen oder die Schnittstellen anzupassen, müssen Sie die BoundFields in TemplateFields konvertieren. Weitere Informationen finden Sie in den Lernprogrammen zum Hinzufügen von Validierungssteuerelementen in die Bearbeitungs- und Einfügeschnittstellen und zum Anpassen der Datenänderungsschnittstelle.
Denken Sie außerdem daran, dass die DetailsView zum Aktualisieren und Löschen den aktuellen Produktwert DataKey
verwendet, der nur vorhanden ist, wenn die DataKeyNames
Eigenschaft konfiguriert ist. Wenn das Bearbeiten oder Löschen keine Auswirkungen hat, stellen Sie sicher, dass die DataKeyNames
Eigenschaft festgelegt ist.
Einschränkungen der automatischen Generierung von SQL-Anweisungen
Da die Option "Generieren", INSERT
, UPDATE
und DELETE
-Anweisungen nur beim Auswählen von Spalten aus einer Tabelle verfügbar ist, müssen Sie für komplexere Abfragen eigene INSERT
, UPDATE
und DELETE
-Anweisungen schreiben, wie wir es in Schritt 1 getan haben. In der Regel verwenden SQL-Anweisungen SELECT
JOIN
, um Daten aus einer oder mehreren Nachschlagetabellen für Anzeigezwecke abzurufen (z. B. das Feld der Tabelle Categories
CategoryName
, wenn Produktinformationen angezeigt werden). Gleichzeitig möchten wir es dem Benutzer ermöglichen, Daten in die Kerntabelle zu bearbeiten, zu aktualisieren oder einzufügen (Products
in diesem Fall).
Die INSERT
, UPDATE
und DELETE
Anweisungen können manuell eingegeben werden, aber beachten Sie den folgenden zeitsparenden Tipp. Richten Sie zunächst die SqlDataSource so ein, dass sie Daten nur aus der Products
Tabelle abruft. Verwenden Sie den Assistenten zum Konfigurieren von Datenquellen, um Spalten aus einer Tabelle oder Ansicht anzugeben, sodass Sie die INSERT
, UPDATE
und DELETE
-Anweisungen automatisch generieren können. Wählen Sie dann nach Abschluss des Assistenten die Option, die Auswahlabfrage im Eigenschaftenfenster zu konfigurieren (oder gehen Sie alternativ zum Assistenten zum Konfigurieren der Datenquelle zurück, verwenden Sie jedoch die Option "Benutzerdefinierte SQL-Anweisung oder gespeicherte Prozedur angeben"). Aktualisieren Sie dann die SELECT
Anweisung so, dass sie die JOIN
Syntax enthält. Diese Technik bietet die zeitsparenden Vorteile der automatisch generierten SQL-Anweisungen und ermöglicht eine angepasstere SELECT
Anweisung.
Eine weitere Einschränkung der automatischen Generierung von INSERT
, UPDATE
und DELETE
Anweisungen besteht darin, dass die Spalten in den INSERT
und UPDATE
Anweisungen auf den spalten basieren, die von der SELECT
Anweisung zurückgegeben werden. Möglicherweise müssen wir jedoch mehr oder weniger Felder aktualisieren oder einfügen. In dem Beispiel aus Schritt 2 möchten wir beispielsweise das UnitPrice
BoundField schreibgeschützt haben. In diesem Fall sollte es nicht in der UpdateCommand
erscheinen. Oder wir möchten den Wert eines Tabellenfelds festlegen, das nicht in der GridView angezeigt wird. Wenn Sie z. B. einen neuen Datensatz hinzufügen, möchten wir möglicherweise, dass der QuantityPerUnit
Wert auf TODO festgelegt ist.
Wenn solche Anpassungen erforderlich sind, müssen Sie sie manuell vornehmen, entweder über das Eigenschaftenfenster, die Option "Benutzerdefinierte SQL-Anweisung angeben" oder "Gespeicherte Prozedur" im Assistenten oder über die deklarative Syntax.
Hinweis
Beachten Sie beim Hinzufügen von Parametern, die nicht über entsprechende Felder im Datenwebsteuerelement verfügen, bedenken Sie, dass diesen Parameterwerten werte auf irgendeine Weise zugewiesen werden müssen. Diese Werte können sein: hartcodiert direkt in der InsertCommand
oder UpdateCommand
; sie können aus einer vordefinierten Quelle wie der Abfragezeichenfolge, dem Sitzungsstatus, Websteuerelementen auf der Seite usw. stammen; oder sie können programmgesteuert zugewiesen werden, wie wir im vorherigen Lernprogramm gesehen haben.
Zusammenfassung
Damit die Datenwebsteuerelemente ihre integrierten Einfüge-, Bearbeitungs- und Löschfunktionen nutzen können, muss das Datenquellensteuerelement, an das sie gebunden sind, eine solche Funktionalität bieten. Für die SqlDataSource bedeutet dies, dass INSERT
, UPDATE
und DELETE
SQL-Anweisungen den InsertCommand
, UpdateCommand
und DeleteCommand
Eigenschaften zugewiesen werden müssen. Diese Eigenschaften und die entsprechenden Parameterauflistungen können über den Assistenten zum Konfigurieren von Datenquellen manuell oder automatisch generiert werden. In diesem Lernprogramm haben wir beide Techniken untersucht.
Wir haben die optimistische Parallelität mit objectDataSource im Lernprogramm "Implementieren optimistischer Parallelität" untersucht. Das SqlDataSource-Steuerelement bietet außerdem eine optimistische Parallelitätsunterstützung. Wie in Schritt 2 erwähnt, bietet der Assistent beim automatischen Generieren der Anweisungen INSERT
, UPDATE
und DELETE
die Option "Optimistische Parallelität verwenden" an. Wie wir im nächsten Lernprogramm sehen werden, ändert die Verwendung optimistischer Parallelität mit sqlDataSource die WHERE
Klauseln in den UPDATE
und DELETE
Anweisungen, um sicherzustellen, dass sich die Werte für die anderen Spalten seit der letzten Anzeige der Daten auf der Seite nicht geändert haben.
Glückliche Programmierung!
Zum Autor
Scott Mitchell, Autor von sieben ASP/ASP.NET Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft Web Technologies zusammen. Scott arbeitet als unabhängiger Berater, Trainer und Schriftsteller. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Er kann bei mitchell@4GuysFromRolla.comerreicht werden.