Freigeben über


Einfügen, Aktualisieren und Löschen von Daten mit dem SqlDataSource-Steuerelement (C#)

von Scott Mitchell

PDF herunterladen

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:

  1. ConnectionString, die angibt, an welche Datenbank die Abfrage gesendet werden soll, und
  2. 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.

Alle Produkte sind aufgeführt, sortiert nach ProductID

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 Eigenschaften DeleteCommand und DeleteParameters 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.aspxdie 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.

Screenshot des Fensters

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.

Screenshot des Fensters @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.

Jede GridView-Zeile enthält jetzt eine Schaltfläche

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".

Durch Klicken auf die Schaltfläche

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 ManageProductsDataSourcezu erstellen.

Erstellen einer neuen SqlDataSource named ManageProductsDataSource

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.

Zurückgeben der Spalten

Abbildung 7: Verwenden der Products Tabelle, Zurückgeben von ProductID, ProductName, UnitPriceund 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".

Aktivieren Sie das Kontrollkästchen

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, UpdateCommandund 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.

Die Standardbearbeitungsschnittstelle für DetailsViews

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 SELECTJOIN, um Daten aus einer oder mehreren Nachschlagetabellen für Anzeigezwecke abzurufen (z. B. das Feld der Tabelle CategoriesCategoryName, wenn Produktinformationen angezeigt werden). Gleichzeitig möchten wir es dem Benutzer ermöglichen, Daten in die Kerntabelle zu bearbeiten, zu aktualisieren oder einzufügen (Productsin 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, UPDATEund 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, UPDATEund DELETE SQL-Anweisungen den InsertCommand, UpdateCommandund 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.