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
Im vorherigen Lernprogramm haben wir erfahren, wie Sie mithilfe des TableAdapter-Assistenten neue gespeicherte Prozeduren generieren. In diesem Lernprogramm erfahren Sie, wie derselbe TableAdapter-Assistent mit vorhandenen gespeicherten Prozeduren arbeiten kann. Außerdem erfahren Wir, wie Sie unserer Datenbank manuell neue gespeicherte Prozeduren hinzufügen.
Einführung
Im vorherigen Lernprogramm haben wir gesehen, wie die Typed DataSet s TableAdapters so konfiguriert werden können, dass gespeicherte Prozeduren für den Zugriff auf Daten anstelle von Ad-hoc-SQL-Anweisungen verwendet werden können. Insbesondere haben wir untersucht, wie der TableAdapter-Assistent diese gespeicherten Prozeduren automatisch erstellt. Beim Portieren einer Legacyanwendung zu ASP.NET 2.0 oder beim Erstellen einer ASP.NET 2.0-Website um ein vorhandenes Datenmodell besteht die Wahrscheinlichkeit, dass die Datenbank bereits die benötigten gespeicherten Prozeduren enthält. Alternativ können Sie ihre gespeicherten Prozeduren manuell oder über ein anderes Tool als den TableAdapter-Assistenten erstellen, der Ihre gespeicherten Prozeduren automatisch generiert.
In diesem Lernprogramm wird erläutert, wie Sie das TableAdapter so konfigurieren, dass vorhandene gespeicherte Prozeduren verwendet werden. Da die Northwind-Datenbank nur über einen kleinen Satz integrierter gespeicherter Prozeduren verfügt, werden wir auch die Schritte untersuchen, die zum manuellen Hinzufügen neuer gespeicherter Prozeduren zur Datenbank über die Visual Studio-Umgebung erforderlich sind. Los geht's!
Hinweis
Im Lernprogramm zum Umschließen von Datenbankänderungen in einem Transaktions-Lernprogramm haben wir dem TableAdapter Methoden hinzugefügt, um Transaktionen (BeginTransaction
, CommitTransaction
usw.) zu unterstützen. Alternativ können Transaktionen vollständig innerhalb einer gespeicherten Prozedur verwaltet werden, die keine Änderungen am Datenzugriffsschichtcode erfordert. In diesem Lernprogramm untersuchen wir die T-SQL-Befehle, die zum Ausführen der Anweisungen einer gespeicherten Prozedur innerhalb des Bereichs einer Transaktion verwendet werden.
Schritt 1: Hinzufügen gespeicherter Prozeduren zur Northwind-Datenbank
Visual Studio erleichtert das Hinzufügen neuer gespeicherter Prozeduren zu einer Datenbank. Wir fügen der Northwind-Datenbank eine neue gespeicherte Prozedur hinzu, die alle Spalten aus der Tabelle für diejenigen zurückgibt, die Products
einen bestimmten CategoryID
Wert aufweisen. Erweitern Sie im Fenster "Server-Explorer" die Northwind-Datenbank, sodass ihre Ordner – Datenbankdiagramme, Tabellen, Ansichten usw. – angezeigt werden. Wie wir im vorherigen Lernprogramm gesehen haben, enthält der Ordner "Gespeicherte Prozeduren" die vorhandenen gespeicherten Prozeduren der Datenbank. Wenn Sie eine neue gespeicherte Prozedur hinzufügen möchten, klicken Sie einfach mit der rechten Maustaste auf den Ordner "Gespeicherte Prozeduren", und wählen Sie im Kontextmenü die Option "Neue gespeicherte Prozedur hinzufügen" aus.
Abbildung 1: Klicken Sie mit der rechten Maustaste auf den Ordner "Gespeicherte Prozeduren", und fügen Sie eine neue gespeicherte Prozedur hinzu (Klicken Sie hier, um das Bild mit voller Größe anzuzeigen)
In Abbildung 1 wird durch Auswählen der Option "Neue gespeicherte Prozedur hinzufügen" ein Skriptfenster in Visual Studio mit der Gliederung des SQL-Skripts geöffnet, das zum Erstellen der gespeicherten Prozedur erforderlich ist. Es ist unser Auftrag, dieses Skript auszuwickeln und auszuführen, an welchem Punkt die gespeicherte Prozedur der Datenbank hinzugefügt wird.
Geben Sie das folgende Skript ein:
CREATE PROCEDURE dbo.Products_SelectByCategoryID
(
@CategoryID int
)
AS
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE CategoryID = @CategoryID
Wenn dieses Skript ausgeführt wird, wird der Northwind-Datenbank eine neue gespeicherte Prozedur mit dem Namen Products_SelectByCategoryID
"Northwind" hinzugefügt. Diese gespeicherte Prozedur akzeptiert einen einzelnen Eingabeparameter (@CategoryID
vom Typ int
) und gibt alle Felder für diese Produkte mit einem übereinstimmenden CategoryID
Wert zurück.
Um dieses CREATE PROCEDURE
Skript auszuführen und die gespeicherte Prozedur der Datenbank hinzuzufügen, klicken Sie auf das Symbol "Speichern" in der Symbolleiste, oder drücken Sie STRG+S. Anschließend wird der Ordner "Gespeicherte Prozeduren" aktualisiert und zeigt die neu erstellte gespeicherte Prozedur an. Außerdem ändert sich das Skript im Fenster dezent von CREATE PROCEDURE dbo.Products_SelectProductByCategoryID
zu ALTER PROCEDURE
dbo.Products_SelectProductByCategoryID
.
CREATE PROCEDURE
fügt der Datenbank eine neue gespeicherte Prozedur hinzu, während ALTER PROCEDURE
eine vorhandene aktualisiert wird. Da sich der Start des Skripts geändert hat, werden die Eingabeparameter der gespeicherten Prozeduren oder SQL-Anweisungen geändert ALTER PROCEDURE
und durch Klicken auf das Symbol "Speichern" die gespeicherte Prozedur mit diesen Änderungen aktualisiert.
Abbildung 2 zeigt Visual Studio, nachdem die Products_SelectByCategoryID
gespeicherte Prozedur gespeichert wurde.
Abbildung 2: Die gespeicherte Prozedur Products_SelectByCategoryID
wurde der Datenbank hinzugefügt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Schritt 2: Konfigurieren des TableAdapters für die Verwendung einer vorhandenen gespeicherten Prozedur
Nachdem die Products_SelectByCategoryID
gespeicherte Prozedur der Datenbank hinzugefügt wurde, können wir unsere Datenzugriffsebene so konfigurieren, dass diese gespeicherte Prozedur verwendet wird, wenn eine seiner Methoden aufgerufen wird. Insbesondere fügen wir dem typierten DataSet eine GetProductsByCategoryID(<_i22_>categoryID)<!--_i22_-->
Methode hinzuProductsTableAdapter
, die die NorthwindWithSprocs
gerade erstellte gespeicherte Prozedur aufruft.Products_SelectByCategoryID
Öffnen Sie zunächst das NorthwindWithSprocs
DataSet. Klicken Sie mit der rechten Maustaste auf die ProductsTableAdapter
Option "Abfrage hinzufügen", um den Konfigurations-Assistenten für TableAdapter-Abfragen zu starten.
Im vorherigen Lernprogramm haben wir uns entschieden, dass das TableAdapter-Objekt eine neue gespeicherte Prozedur für uns erstellt. In diesem Lernprogramm möchten wir jedoch die neue TableAdapter-Methode mit der vorhandenen Products_SelectByCategoryID
gespeicherten Prozedur verbinden. Wählen Sie daher im ersten Schritt des Assistenten die Option "Vorhandene gespeicherte Prozedur verwenden" aus, und klicken Sie dann auf "Weiter".
Abbildung 3: Auswählen der Option "Vorhandene gespeicherte Prozedur verwenden" (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Der folgende Bildschirm enthält eine Dropdownliste, die mit den gespeicherten Prozeduren der Datenbank aufgefüllt wird. Wenn Sie eine gespeicherte Prozedur auswählen, werden die Eingabeparameter auf der linken Seite und die zurückgegebenen Datenfelder (sofern vorhanden) auf der rechten Seite aufgelistet. Wählen Sie die Products_SelectByCategoryID
gespeicherte Prozedur aus der Liste aus, und klicken Sie auf "Weiter".
Abbildung 4: Auswählen der Products_SelectByCategoryID
gespeicherten Prozedur (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Der nächste Bildschirm fragt uns, welche Art von Daten von der gespeicherten Prozedur zurückgegeben wird, und unsere Antwort hier bestimmt den Typ, der von der TableAdapter-Methode zurückgegeben wird. Wenn beispielsweise angegeben wird, dass tabellarische Daten zurückgegeben werden, gibt die Methode eine ProductsDataTable
Instanz zurück, die mit den von der gespeicherten Prozedur zurückgegebenen Datensätzen aufgefüllt wird. Wenn jedoch angegeben wird, dass diese gespeicherte Prozedur einen einzelnen Wert zurückgibt, gibt "TableAdapter" einen Object
Wert zurück, der dem Wert in der ersten Spalte des ersten Datensatzes zugewiesen wird, der von der gespeicherten Prozedur zurückgegeben wird.
Da die Products_SelectByCategoryID
gespeicherte Prozedur alle Produkte zurückgibt, die zu einer bestimmten Kategorie gehören, wählen Sie die erste Antwort - Tabellarische Daten - aus, und klicken Sie auf Weiter.
Abbildung 5: Gibt an, dass die gespeicherte Prozedur tabellarische Daten zurückgibt (Klicken Sie, um das Bild in voller Größe anzuzeigen)
All das bleibt, um anzugeben, welche Methodenmuster verwendet werden sollen, gefolgt von den Namen für diese Methoden. Lassen Sie sowohl die Optionen "DataTable ausfüllen" als auch "DataTable zurückgeben" aktiviert, benennen Sie die Methoden FillByCategoryID
jedoch in und GetProductsByCategoryID
um. Klicken Sie dann auf "Weiter", um eine Zusammenfassung der Aufgaben zu überprüfen, die der Assistent ausführt. Wenn alles richtig aussieht, klicken Sie auf "Fertig stellen".
Abbildung 6: Benennen der Methoden FillByCategoryID
und GetProductsByCategoryID
(Klicken, um das Bild in voller Größe anzuzeigen)
Hinweis
Die soeben erstellten FillByCategoryID
TableAdapter-Methoden und GetProductsByCategoryID
erwarten einen Eingabeparameter vom Typ Integer
. Dieser Eingabeparameterwert wird über seinen @CategoryID
Parameter an die gespeicherte Prozedur übergeben. Wenn Sie die Parameter der Products_SelectByCategory
gespeicherten Prozedur ändern, müssen Sie auch die Parameter für diese TableAdapter-Methoden aktualisieren. Wie im vorherigen Lernprogramm erläutert, kann dies auf eine von zwei Arten erfolgen: durch manuelles Hinzufügen oder Entfernen von Parametern aus der Parameterauflistung oder durch erneutes Ausführen des TableAdapter-Assistenten.
Schritt 3: Hinzufügen einerGetProductsByCategoryID(categoryID)
Methode zur BLL
Nachdem die GetProductsByCategoryID
DAL-Methode abgeschlossen ist, besteht der nächste Schritt darin, zugriff auf diese Methode in der Geschäftslogikebene bereitzustellen. Öffnen Sie die ProductsBLLWithSprocs
Klassendatei, und fügen Sie die folgende Methode hinzu:
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsByCategoryID(ByVal categoryID As Integer) _
As NorthwindWithSprocs.ProductsDataTable
Return Adapter.GetProductsByCategoryID(categoryID)
End Function
Diese BLL-Methode gibt einfach die ProductsDataTable
von der ProductsTableAdapter
Methode GetProductsByCategoryID
zurückgegebene Methode zurück. Das DataObjectMethodAttribute
Attribut stellt Metadaten bereit, die vom Assistenten zum Konfigurieren von Datenquellen von ObjectDataSource verwendet werden. Insbesondere wird diese Methode in der Dropdownliste der SELECT-Registerkarte angezeigt.
Schritt 4: Anzeigen von Produkten nach Kategorie
Zum Testen der neu hinzugefügten Products_SelectByCategoryID
gespeicherten Prozedur und der entsprechenden DAL- und BLL-Methoden erstellen wir eine ASP.NET Seite, die eine DropDownList und ein GridView enthält. Die DropDownList listet alle Kategorien in der Datenbank auf, während die GridView die Produkte anzeigt, die zur ausgewählten Kategorie gehören.
Hinweis
Wir haben Master-/Detailschnittstellen mit DropDownLists in früheren Lernprogrammen erstellt. Ausführlichere Informationen zur Implementierung eines solchen Master-/Detailberichts finden Sie im Lernprogramm "Master/Detailfilterung mit DropDownList ".
Öffnen Sie die ExistingSprocs.aspx
Seite im AdvancedDAL
Ordner, und ziehen Sie eine DropDownList aus der Toolbox auf den Designer. Legen Sie die DropDownList-Eigenschaft ID
auf Categories
und deren AutoPostBack
Eigenschaft auf True
. Binden Sie als Nächstes aus dem Smarttag die DropDownList an eine neue ObjectDataSource mit dem Namen CategoriesDataSource
. Konfigurieren Sie die ObjectDataSource so, dass sie ihre Daten aus der CategoriesBLL
Klassenmethode GetCategories
abruft. Legen Sie die Dropdownlisten in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest.
Abbildung 7: Abrufen von Daten aus der Klasse-Methode CategoriesBLL
GetCategories
(Klicken Sie, um das Bild in voller Größe anzuzeigen)
Abbildung 8: Festlegen der Dropdownlisten in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) (Klicken, um das Bild in voller Größe anzuzeigen)
Konfigurieren Sie nach Abschluss des ObjectDataSource-Assistenten das DropDownList-Element, um das CategoryName
Datenfeld anzuzeigen und das CategoryID
Feld für jedes Value
Feld zu ListItem
verwenden.
An diesem Punkt sollte das deklarative Markup von DropDownList und ObjectDataSource den folgenden ähneln:
<asp:DropDownList ID="Categories" runat="server" AutoPostBack="True"
DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
DataValueField="CategoryID">
</asp:DropDownList>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
Ziehen Sie als Nächstes eine GridView auf den Designer, und platzieren Sie sie unter der DropDownList. Legen Sie die GridView-Objekte ID
auf ProductsByCategory
das Smarttag fest und binden Sie sie an eine neue ObjectDataSource mit dem Namen ProductsByCategoryDataSource
. Konfigurieren Sie die ProductsByCategoryDataSource
ObjectDataSource so, dass sie die ProductsBLLWithSprocs
Klasse verwendet, indem Sie ihre Daten mithilfe der GetProductsByCategoryID(categoryID)
Methode abrufen. Da diese GridView nur zum Anzeigen von Daten verwendet wird, legen Sie die Dropdownlisten in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest, und klicken Sie auf 'Weiter'.
Abbildung 9: Konfigurieren der ObjectDataSource für die Verwendung der ProductsBLLWithSprocs
Klasse (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Abbildung 10: Abrufen von Daten aus der GetProductsByCategoryID(categoryID)
Methode (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Die auf der Registerkarte SELECT ausgewählte Methode erwartet einen Parameter, sodass der letzte Schritt des Assistenten uns zur Eingabe der Quelle des Parameters auffordert. Legen Sie die Dropdownliste "Parameterquelle" auf "Steuerelement" fest, und wählen Sie das Categories
Steuerelement aus der Dropdownliste "ControlID" aus. Klicken Sie auf Fertig stellen, um den Assistenten abzuschließen.
Abbildung 11: Verwenden der Categories
DropDownList als Quelle des categoryID
Parameters (Klicken, um das Bild in voller Größe anzuzeigen)
Nach Abschluss des ObjectDataSource-Assistenten fügt Visual Studio BoundFields und ein CheckBoxField für jedes der Produktdatenfelder hinzu. Sie können diese Felder nach Bedarf anpassen.
Besuchen Sie die Seite über einen Browser. Beim Besuch der Seite wird die Kategorie "Getränke" ausgewählt und die entsprechenden Produkte im Raster aufgeführt. Wenn Sie die Dropdownliste in eine alternative Kategorie ändern, wie in Abbildung 12 dargestellt, wird ein Postback verursacht und das Raster mit den Produkten der neu ausgewählten Kategorie neu geladen.
Abbildung 12: Die Produkte in der Kategorie "Produktion" werden angezeigt (Zum Anzeigen des Bilds mit voller Größe klicken)
Schritt 5: Umschließen der Anweisungen einer gespeicherten Prozedur im Rahmen einer Transaktion
Im Lernprogramm zum Umschließen von Datenbankänderungen in einem Transaktionslernprogramm haben wir Techniken zum Ausführen einer Reihe von Datenbankänderungsanweisungen im Rahmen einer Transaktion erörtert. Erinnern Sie sich daran, dass die änderungen, die unter dem Dach einer Transaktion ausgeführt wurden, entweder alle erfolgreich oder alle fehlschlagen, was die Atomität garantiert. Zu den Techniken für die Verwendung von Transaktionen gehören:
- Verwenden der Klassen im
System.Transactions
Namespace - Verwenden der Datenzugriffsebene ADO.NET Klassen wie
SqlTransaction
- Hinzufügen der T-SQL-Transaktionsbefehle direkt in der gespeicherten Prozedur
Die Umbruchdatenbankänderungen in einem Transaktionslernprogramm verwendeten die ADO.NET Klassen im DAL. Im restlichen Teil dieses Lernprogramms wird untersucht, wie Eine Transaktion mithilfe von T-SQL-Befehlen in einer gespeicherten Prozedur verwaltet wird.
Die drei wichtigsten SQL-Befehle zum manuellen Starten, Commit und Rollback einer Transaktion sind BEGIN TRANSACTION
, COMMIT TRANSACTION
bzw ROLLBACK TRANSACTION
. . Wie beim ADO.NET Ansatz müssen wir bei der Verwendung von Transaktionen aus einer gespeicherten Prozedur das folgende Muster anwenden:
- Geben Sie den Beginn einer Transaktion an.
- Führen Sie die SQL-Anweisungen aus, die die Transaktion umfassen.
- Wenn in einer der Anweisungen aus Schritt 2 ein Fehler auftritt, führen Sie ein Rollback der Transaktion durch.
- Wenn alle Anweisungen aus Schritt 2 ohne Fehler abgeschlossen sind, übernehmen Sie die Transaktion.
Dieses Muster kann in der T-SQL-Syntax mithilfe der folgenden Vorlage implementiert werden:
BEGIN TRY
BEGIN TRANSACTION -- Start the transaction
... Perform the SQL statements that makeup the transaction ...
-- If we reach here, success!
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Whoops, there was an error
ROLLBACK TRANSACTION
-- Raise an error with the
-- details of the exception
DECLARE @ErrMsg nvarchar(4000),
@ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
Die Vorlage beginnt mit der Definition eines TRY...CATCH
Blocks, einem neuen Konstrukt für SQL Server 2005. Wie bei Try...Catch
Blöcken in Visual Basic führt der SQL-Block TRY...CATCH
die Anweisungen im TRY
Block aus. Wenn eine Anweisung einen Fehler auslöst, wird das Steuerelement sofort in den CATCH
Block übertragen.
Wenn es keine Fehler beim Ausführen der SQL-Anweisungen gibt, die die Transaktion bilden, führt die COMMIT TRANSACTION
Anweisung einen Commit für die Änderungen durch und schließt die Transaktion ab. Wenn jedoch eine der Anweisungen zu einem Fehler führt, gibt der ROLLBACK TRANSACTION
Block CATCH
die Datenbank vor dem Beginn der Transaktion in den Zustand zurück. Die gespeicherte Prozedur löst auch einen Fehler mithilfe des RAISERROR-Befehls aus, der dazu führt, dass in der Anwendung ein SqlException
Fehler ausgelöst wird.
Hinweis
Da der TRY...CATCH
Block neu in SQL Server 2005 ist, funktioniert die obige Vorlage nicht, wenn Sie ältere Versionen von Microsoft SQL Server verwenden.
Sehen wir uns ein konkretes Beispiel an. Zwischen den Categories
Tabellen Products
ist eine Fremdschlüsseleinschränkung vorhanden, was bedeutet, dass jedes CategoryID
Feld in der Products
Tabelle einem CategoryID
Wert in der Categories
Tabelle zugeordnet werden muss. Jede Aktion, die gegen diese Einschränkung verstößt, z. B. den Versuch, eine Kategorie zu löschen, die produkte zugeordnet hat, führt zu einer Verletzung der Fremdschlüsseleinschränkung. Um dies zu überprüfen, überprüfen Sie das Beispiel zum Aktualisieren und Löschen vorhandener Binärdaten im Abschnitt "Working with Binary Data" (~/BinaryData/UpdatingAndDeleting.aspx
). Diese Seite listet jede Kategorie im System zusammen mit den Schaltflächen "Bearbeiten" und "Löschen" auf (siehe Abbildung 13), aber wenn Sie versuchen, eine Kategorie zu löschen, die Produkte zugeordnet hat , z. B. Getränke, schlägt die Löschung aufgrund einer Verletzung der Fremdschlüsseleinschränkung fehl (siehe Abbildung 14).
Abbildung 13: Jede Kategorie wird in einer GridView mit Bearbeitungs- und Löschschaltflächen angezeigt (Klicken, um das Bild in voller Größe anzuzeigen)
Abbildung 14: Eine Kategorie mit vorhandenen Produkten kann nicht gelöscht werden (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Stellen Sie sich jedoch vor, dass Kategorien gelöscht werden sollen, unabhängig davon, ob sie über zugehörige Produkte verfügen. Wenn eine Kategorie mit Produkten gelöscht werden soll, stellen Wir uns vor, dass wir auch ihre vorhandenen Produkte löschen möchten (obwohl eine andere Option darin bestehen würde, ihre Produkte CategoryID
einfach auf werte festzulegen NULL
). Diese Funktionalität könnte über die Kaskadenregeln der Fremdschlüsseleinschränkung implementiert werden. Alternativ können wir eine gespeicherte Prozedur erstellen, die einen @CategoryID
Eingabeparameter akzeptiert und beim Aufruf explizit alle zugehörigen Produkte und dann die angegebene Kategorie löscht.
Unser erster Versuch bei einer solchen gespeicherten Prozedur könnte wie folgt aussehen:
CREATE PROCEDURE dbo.Categories_Delete
(
@CategoryID int
)
AS
-- First, delete the associated products...
DELETE FROM Products
WHERE CategoryID = @CategoryID
-- Now delete the category
DELETE FROM Categories
WHERE CategoryID = @CategoryID
Obwohl dies definitiv die zugehörigen Produkte und Kategorien löscht, geschieht dies nicht unter dem Dach einer Transaktion. Stellen Sie sich vor, dass es eine andere Fremdschlüsseleinschränkung Categories
gibt, die das Löschen eines bestimmten @CategoryID
Werts verbieten würde. Das Problem besteht darin, dass in einem solchen Fall alle Produkte gelöscht werden, bevor wir versuchen, die Kategorie zu löschen. Das Nettoergebnis ist, dass diese gespeicherte Prozedur für eine solche Kategorie alle ihre Produkte entfernen würde, während die Kategorie verbleibt, da sie weiterhin verwandte Datensätze in einer anderen Tabelle enthält.
Wenn die gespeicherte Prozedur innerhalb des Gültigkeitsbereichs einer Transaktion eingeschlossen wurde, werden die Löschdaten der Products
Tabelle jedoch im Gesicht eines fehlgeschlagenen Löschvorgangs Categories
zurückgesetzt. Das folgende Skript für gespeicherte Prozeduren verwendet eine Transaktion, um die Atomität zwischen den beiden DELETE
Anweisungen zu gewährleisten:
CREATE PROCEDURE dbo.Categories_Delete
(
@CategoryID int
)
AS
BEGIN TRY
BEGIN TRANSACTION -- Start the transaction
-- First, delete the associated products...
DELETE FROM Products
WHERE CategoryID = @CategoryID
-- Now delete the category
DELETE FROM Categories
WHERE CategoryID = @CategoryID
-- If we reach here, success!
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Whoops, there was an error
ROLLBACK TRANSACTION
-- Raise an error with the
-- details of the exception
DECLARE @ErrMsg nvarchar(4000),
@ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
Nehmen Sie sich einen Moment Zeit, um die Categories_Delete
gespeicherte Prozedur zur Northwind-Datenbank hinzuzufügen. Anweisungen zum Hinzufügen gespeicherter Prozeduren zu einer Datenbank finden Sie in Schritt 1.
Schritt 6: Aktualisieren desCategoriesTableAdapter
Während wir die Categories_Delete
gespeicherte Prozedur der Datenbank hinzugefügt haben, ist die DAL zurzeit so konfiguriert, dass ad-hoc SQL-Anweisungen zum Ausführen des Löschvorgangs verwendet werden. Wir müssen die CategoriesTableAdapter
gespeicherte Prozedur aktualisieren und anweisen, stattdessen die Categories_Delete
gespeicherte Prozedur zu verwenden.
Hinweis
Weiter oben in diesem Lernprogramm haben wir mit Dem NorthwindWithSprocs
DataSet gearbeitet. Dieses DataSet verfügt jedoch nur über eine einzige Entität, ProductsDataTable
und wir müssen mit Kategorien arbeiten. Für den Rest dieses Lernprogramms, wenn ich über die Datenzugriffsschicht spreche, verweise ich auf das Northwind
DataSet, die wir zuerst im Lernprogramm zum Erstellen einer Datenzugriffsschicht erstellt haben.
Öffnen Sie das Northwind DataSet, wählen Sie das DataSet aus, und wechseln Sie zum Eigenschaftenfenster.Open the Northwind DataSet, select the CategoriesTableAdapter
, and go to the Eigenschaftenfenster. In der Eigenschaftenfenster werden die InsertCommand
Vom UpdateCommand
DeleteCommand
TableAdapter verwendeten , und SelectCommand
die Namen- und Verbindungsinformationen aufgeführt. Erweitern Sie die DeleteCommand
Eigenschaft, um die Details anzuzeigen. Wie in Abbildung 15 dargestellt, wird die DeleteCommand
Eigenschaft auf CommandType
"Text" festgelegt, die ihn anweist, den Text in der CommandText
Eigenschaft als Ad-hoc-SQL-Abfrage zu senden.
Abbildung 15: Wählen Sie im Designer aus CategoriesTableAdapter
, um die Eigenschaften im Eigenschaftenfenster anzuzeigen.
Um diese Einstellungen zu ändern, wählen Sie den Text (DeleteCommand) im Eigenschaftenfenster aus, und wählen Sie (Neu) aus der Dropdownliste aus. Dadurch werden die Einstellungen für die CommandText
Eigenschaften CommandType
und Parameters
Eigenschaften gelöscht. Legen Sie als Nächstes die CommandType
Eigenschaft auf StoredProcedure
und geben Sie dann den Namen der gespeicherten Prozedur für die CommandText
(dbo.Categories_Delete
) ein. Wenn Sie sicherstellen, dass Sie die Eigenschaften in dieser Reihenfolge eingeben – zuerst CommandType
und dann – CommandText
füllt Visual Studio automatisch die Parameters-Auflistung auf. Wenn Sie diese Eigenschaften in dieser Reihenfolge nicht eingeben, müssen Sie die Parameter manuell über den Parametersammlungs-Editor hinzufügen. In beiden Fällen ist es ratsam, auf die Auslassungspunkte in der Parameters-Eigenschaft zu klicken, um den Parameters-Auflistungs-Editor anzuzeigen, um zu überprüfen, ob die richtigen Parametereinstellungen vorgenommen wurden (siehe Abbildung 16). Wenn im Dialogfeld keine Parameter angezeigt werden, fügen Sie den @CategoryID
Parameter manuell hinzu (Sie müssen den @RETURN_VALUE
Parameter nicht hinzufügen).
Abbildung 16: Sicherstellen, dass die Parametereinstellungen korrekt sind
Nachdem die DAL aktualisiert wurde, löscht das Löschen einer Kategorie automatisch alle zugehörigen Produkte und führt dies unter dem Dach einer Transaktion durch. Um dies zu überprüfen, kehren Sie zur Seite "Aktualisieren und Löschen vorhandener Binärdaten" zurück, und klicken Sie auf die Schaltfläche "Löschen" für eine der Kategorien. Mit einem einzigen Mausklick wird die Kategorie und alle zugehörigen Produkte gelöscht.
Hinweis
Vor dem Testen der Categories_Delete
gespeicherten Prozedur, die eine Reihe von Produkten zusammen mit der ausgewählten Kategorie löscht, ist es möglicherweise umsichtig, eine Sicherungskopie Ihrer Datenbank zu erstellen. Wenn Sie die NORTHWND.MDF
Datenbank in App_Data
verwenden, schließen Sie Einfach Visual Studio, und kopieren Sie die MDF- und LDF-Dateien in App_Data
einen anderen Ordner. Nach dem Testen der Funktionalität können Sie die Datenbank wiederherstellen, indem Sie Visual Studio schließen und die aktuellen MDF- und LDF-Dateien App_Data
durch die Sicherungskopien ersetzen.
Zusammenfassung
Während der Assistent von TableAdapter automatisch gespeicherte Prozeduren für uns generiert, gibt es Zeiten, in denen wir solche gespeicherten Prozeduren bereits erstellt haben oder diese manuell oder mit anderen Tools erstellen möchten. Um solche Szenarien zu berücksichtigen, kann der TableAdapter auch so konfiguriert werden, dass er auf eine vorhandene gespeicherte Prozedur verweist. In diesem Lernprogramm haben wir untersucht, wie Sie gespeicherte Prozeduren manuell über die Visual Studio-Umgebung einer Datenbank hinzufügen und wie Sie die TableAdapter-Methoden mit diesen gespeicherten Prozeduren verbinden. Außerdem haben wir die T-SQL-Befehle und das Skriptmuster untersucht, das zum Starten, Commit und Rollback von Transaktionen innerhalb einer gespeicherten Prozedur verwendet wird.
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.
Besonderer Dank an
Diese Lernprogrammreihe wurde von vielen hilfreichen Prüfern überprüft. Leitende Prüfer für dieses Lernprogramm waren Hilton Geisenow, S ren Jacob Lauritsen und Teresa Murphy. Möchten Sie meine bevorstehenden MSDN-Artikel überprüfen? Wenn ja, schicken Sie mir eine Nachricht an mitchell@4GuysFromRolla.com.