Uso di stored procedure esistenti per i TableAdapter del set di dati tipizzato (VB)

di Scott Mitchell

Scarica il PDF

Nell'esercitazione precedente si è appreso come usare la Creazione guidata TableAdapter per generare nuove stored procedure. In questa esercitazione viene illustrato come la stessa Procedura guidata TableAdapter può essere usata con stored procedure esistenti. Si apprenderà anche come aggiungere manualmente nuove stored procedure al database.

Introduzione

Nell'esercitazione precedente è stato illustrato come è possibile configurare i TableAdapter di Typed DataSet per usare stored procedure per accedere ai dati anziché istruzioni SQL ad hoc. In particolare, è stato esaminato come creare automaticamente queste stored procedure con la procedura guidata TableAdapter. Quando si esegue la conversione di un'applicazione legacy in ASP.NET 2.0 o quando si crea un sito Web ASP.NET 2.0 intorno a un modello di dati esistente, è probabile che il database contenga già le stored procedure necessarie. In alternativa, è consigliabile creare le stored procedure in base alla mano o tramite alcuni strumenti diversi dalla procedura guidata TableAdapter che genera automaticamente le stored procedure.

In questa esercitazione verrà illustrato come configurare TableAdapter per usare stored procedure esistenti. Poiché il database Northwind include solo un piccolo set di stored procedure predefinite, verranno esaminati anche i passaggi necessari per aggiungere manualmente nuove stored procedure al database tramite l'ambiente di Visual Studio. Iniziamo!

Nota

Nell'esercitazione Modifiche al database di wrapping in un'esercitazione sulle transazioni sono stati aggiunti metodi all'oggetto TableAdapter per supportare le transazioni (BeginTransaction, CommitTransactione così via). In alternativa, le transazioni possono essere gestite interamente all'interno di una stored procedure, che non richiede modifiche al codice livello di accesso ai dati. In questa esercitazione verranno illustrati i comandi T-SQL usati per eseguire istruzioni di stored procedure nell'ambito di una transazione.

Passaggio 1: Aggiunta di stored procedure al database Northwind

Visual Studio semplifica l'aggiunta di nuove stored procedure a un database. Aggiungere una nuova stored procedure al database Northwind che restituisce tutte le colonne della Products tabella per quelle con un valore specifico CategoryID . Nella finestra Esplora server espandere il database Northwind in modo che vengano visualizzate le relative cartelle, diagrammi di database, tabelle, viste e così via. Come illustrato nell'esercitazione precedente, la cartella Stored Procedure contiene le stored procedure esistenti del database. Per aggiungere una nuova stored procedure, fare semplicemente clic con il pulsante destro del mouse sulla cartella Stored Procedure e scegliere l'opzione Aggiungi nuova stored procedure dal menu di scelta rapida.

Fare clic con il pulsante destro del mouse sulla cartella stored procedure e aggiungere una nuova stored procedure

Figura 1: Right-Click cartella stored procedure e Aggiungere una nuova stored procedure (fare clic per visualizzare un'immagine full-size)

Come illustrato nella figura 1, selezionare l'opzione Aggiungi nuova stored procedure apre una finestra di script in Visual Studio con la struttura dello script SQL necessario per creare la stored procedure. Il processo è quello di compilare questo script ed eseguirlo, a questo punto verrà aggiunta la stored procedure al database.

Immettere lo script seguente:

CREATE PROCEDURE dbo.Products_SelectByCategoryID 
(
    @CategoryID int
)
AS
SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products
WHERE CategoryID = @CategoryID

Questo script, quando eseguito, aggiungerà una nuova stored procedure al database Northwind denominato Products_SelectByCategoryID. Questa stored procedure accetta un singolo parametro di input (@CategoryID, di tipo int) e restituisce tutti i campi per tali prodotti con un valore corrispondente CategoryID .

Per eseguire questo CREATE PROCEDURE script e aggiungere la stored procedure al database, fare clic sull'icona Salva nella barra degli strumenti o premere CTRL+S. Dopo aver eseguito questa operazione, la cartella Stored Procedure viene aggiornata, che mostra la stored procedure appena creata. Inoltre, lo script nella finestra cambierà la sottigliezza da CREATE PROCEDURE dbo.Products_SelectProductByCategoryID a ALTER PROCEDUREdbo.Products_SelectProductByCategoryID. CREATE PROCEDURE aggiunge una nuova stored procedure al database, mentre ALTER PROCEDURE ne aggiorna una esistente. Dall'inizio dello script è stato modificato in ALTER PROCEDURE, modificando i parametri di input delle stored procedure o le istruzioni SQL e facendo clic sull'icona Salva verrà aggiornata la stored procedure con queste modifiche.

La figura 2 mostra Visual Studio dopo il salvataggio della Products_SelectByCategoryID stored procedure.

La stored procedure Products_SelectByCategoryID è stata aggiunta al database

Figura 2: La stored procedure Products_SelectByCategoryID è stata aggiunta al database (fare clic per visualizzare l'immagine full-size)

Passaggio 2: Configurazione di TableAdapter per l'uso di una stored procedure esistente

Ora che la stored procedure è stata aggiunta al database, è possibile configurare il Products_SelectByCategoryID livello di accesso ai dati per usare questa stored procedure quando viene richiamato uno dei relativi metodi. In particolare, verrà aggiunto un GetProductsByCategoryID(<_i22_>categoryID)<!--_i22_--> metodo all'oggetto ProductsTableAdapterNorthwindWithSprocs in Typed DataSet che chiama la Products_SelectByCategoryID stored procedure appena creata.

Iniziare aprendo DataSet NorthwindWithSprocs . Fare clic con il pulsante destro del ProductsTableAdapter mouse su e scegliere Aggiungi query per avviare la configurazione guidata query TableAdapter. Nell'esercitazione precedente è stato scelto di creare una nuova stored procedure per l'utente. Per questa esercitazione, tuttavia, si vuole collegare il nuovo metodo TableAdapter alla stored procedure esistente Products_SelectByCategoryID . Scegliere quindi l'opzione Usa stored procedure esistente dal primo passaggio della procedura guidata e quindi fare clic su Avanti.

Scegliere l'opzione Usa stored procedure esistente

Figura 3: Scegliere l'opzione Usa stored procedure esistente (Fare clic per visualizzare l'immagine a dimensioni complete)

La schermata seguente fornisce un elenco a discesa popolato con le stored procedure del database. Selezionando una stored procedure vengono elencati i parametri di input a sinistra e i campi dati restituiti (se presenti) a destra. Scegliere la Products_SelectByCategoryID stored procedure dall'elenco e fare clic su Avanti.

Selezionare la stored procedure Products_SelectByCategoryID

Figura 4: Selezionare la stored procedure (fare clic per visualizzare l'immagineProducts_SelectByCategoryID full-size)

Nella schermata successiva viene chiesto quale tipo di dati viene restituito dalla stored procedure e la risposta qui determina il tipo restituito dal metodo TableAdapter. Ad esempio, se si indica che i dati tabulari vengono restituiti, il metodo restituirà un'istanza ProductsDataTable popolata con i record restituiti dalla stored procedure. Al contrario, se si indica che questa stored procedure restituisce un singolo valore, TableAdapter restituirà un Object valore assegnato nella prima colonna del primo record restituito dalla stored procedure.

Poiché la Products_SelectByCategoryID stored procedure restituisce tutti i prodotti appartenenti a una categoria specifica, scegliere la prima risposta - dati tabulari - e fare clic su Avanti.

Indica che la stored procedure restituisce dati tabulari

Figura 5: Indicare che la stored procedure restituisce dati tabulari (fare clic per visualizzare l'immagine a dimensioni complete)

Tutto ciò che rimane consiste nell'indicare i modelli di metodo da usare seguiti dai nomi per questi metodi. Lasciare selezionata sia l'opzione Fill a DataTable che Restituisce una tabella dati, ma rinominare i metodi in FillByCategoryID e GetProductsByCategoryID. Fare quindi clic su Avanti per esaminare un riepilogo delle attività eseguite dalla procedura guidata. Se tutto sembra corretto, fare clic su Fine.

Assegnare un nome ai metodi FillByCategoryID e GetProductsByCategoryID

Figura 6: Assegnare un nome ai metodi FillByCategoryID e GetProductsByCategoryID (fare clic per visualizzare l'immagine full-size)

Nota

I metodi TableAdapter appena creati FillByCategoryID e GetProductsByCategoryID, prevedono un parametro di input di tipo Integer. Questo valore del parametro di input viene passato alla stored procedure tramite il @CategoryID relativo parametro. Se si modificano i Products_SelectByCategory parametri della stored procedure, è necessario aggiornare anche i parametri per questi metodi TableAdapter. Come illustrato nell'esercitazione precedente, questa operazione può essere eseguita in uno dei due modi seguenti: aggiungendo o rimuovendo manualmente i parametri dall'insieme di parametri o eseguendo nuovamente la procedura guidata TableAdapter.

Passaggio 3: Aggiunta di unGetProductsByCategoryID(categoryID)metodo al BLL

Al termine del GetProductsByCategoryID metodo DAL, il passaggio successivo consiste nel fornire l'accesso a questo metodo nel livello della logica di business. Aprire il file di ProductsBLLWithSprocs classe e aggiungere il metodo seguente:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsByCategoryID(ByVal categoryID As Integer) _
    As NorthwindWithSprocs.ProductsDataTable
    Return Adapter.GetProductsByCategoryID(categoryID)
End Function

Questo metodo BLL restituisce semplicemente l'oggetto ProductsDataTableProductsTableAdapter restituito dal metodo s GetProductsByCategoryID . L'attributo DataObjectMethodAttribute fornisce metadati usati dalla procedura guidata Configura origine dati di ObjectDataSource. In particolare, questo metodo verrà visualizzato nell'elenco a discesa SELECT della scheda SELECT.

Passaggio 4: Visualizzazione di prodotti in base alla categoria

Per testare la stored procedure appena aggiunta Products_SelectByCategoryID e i metodi DAL e BLL corrispondenti, è possibile creare una pagina di ASP.NET contenente un elenco a discesa e un controllo GridView. L'Elenco a discesa elenca tutte le categorie nel database mentre GridView visualizzerà i prodotti appartenenti alla categoria selezionata.

Nota

Sono state create interfacce master/dettagli usando DropDownLists nelle esercitazioni precedenti. Per un'analisi più approfondita sull'implementazione di un report master/dettaglio, vedere l'esercitazione Filtro master/dettaglio con un elenco a discesa .

Aprire la ExistingSprocs.aspx pagina nella AdvancedDAL cartella e trascinare un elenco a discesa dalla casella degli strumenti nella Designer. Impostare la proprietà DropDownList su ID e la relativa AutoPostBack proprietà Categories su True. Successivamente, dal relativo smart tag, associare DropDownList a un nuovo OggettoDataSource denominato CategoriesDataSource. Configurare ObjectDataSource in modo che recupera i dati dal CategoriesBLL metodo della GetCategories classe. Impostare gli elenchi a discesa nelle schede UPDATE, INSERT e DELETE su (Nessuno).

Recuperare dati dal metodo GetCategories della classe CategoriesBLL

Figura 7: Recuperare i dati dal CategoriesBLL metodo della GetCategories classe (fare clic per visualizzare l'immagine full-size)

Impostare la Drop-Down Elenchi nelle schede UPDATE, INSERT e DELETE su (Nessuno)

Figura 8: Impostare la Drop-Down Elenchi nelle schede UPDATE, INSERT e DELETE su (Nessuna) (fare clic per visualizzare l'immagine full-size)

Dopo aver completato la procedura guidata ObjectDataSource, configurare DropDownList per visualizzare il CategoryName campo dati e usare il CategoryID campo come per Value ogni ListItemoggetto .

A questo punto, il markup dichiarativo DropDownList e ObjectDataSource deve essere simile al seguente:

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

Trascinare quindi gridView nella Designer, posizionandola sotto l'elenco a discesa. Impostare GridView su IDProductsByCategory e, dal relativo smart tag, associarlo a un nuovo OggettoDataSource denominato ProductsByCategoryDataSource. ProductsByCategoryDataSource Configurare ObjectDataSource per l'uso della ProductsBLLWithSprocs classe , in modo che recuperi i dati usando il GetProductsByCategoryID(categoryID) metodo . Poiché questo controllo GridView verrà usato solo per visualizzare i dati, impostare gli elenchi a discesa nelle schede UPDATE, INSERT e DELETE su (Nessuno) e fare clic su Avanti.

Configurare ObjectDataSource per l'uso della classe ProductsBLLWithSprocs

Figura 9: Configurare ObjectDataSource per l'uso della classe (fare clic per visualizzare l'immagineProductsBLLWithSprocs a dimensione intera)

Recuperare dati dal metodo GetProductsByCategoryID(categoryID)

Figura 10: Recuperare dati dal GetProductsByCategoryID(categoryID) metodo (fare clic per visualizzare l'immagine a dimensione intera)

Il metodo scelto nella scheda SELECT prevede un parametro, quindi il passaggio finale della procedura guidata richiede l'origine del parametro. Impostare l'elenco a discesa Origine parametri su Controllo e scegliere il Categories controllo dall'elenco a discesa ControlID. Fare clic su Fine per completare la procedura guidata.

Usare l'elenco a discesa Categorie come origine del parametro categoryID

Figura 11: Usare l'elenco Categories a discesa come origine del categoryID parametro (fare clic per visualizzare l'immagine a dimensione intera)

Al termine della procedura guidata ObjectDataSource, Visual Studio aggiungerà BoundFields e checkBoxField per ognuno dei campi dati del prodotto. È possibile personalizzare questi campi in base alle esigenze.

Visitare la pagina tramite un browser. Quando si visita la pagina la categoria Bevande è selezionata e i prodotti corrispondenti elencati nella griglia. Se si modifica l'elenco a discesa in una categoria alternativa, come illustrato nella figura 12, viene generato un postback e ricaricato la griglia con i prodotti della categoria appena selezionata.

Vengono visualizzati i prodotti nella categoria Di produzione

Figura 12: Vengono visualizzati i prodotti nella categoria Produce (fare clic per visualizzare l'immagine a dimensione intera)

Passaggio 5: Wrapping di istruzioni di una stored procedure nell'ambito di una transazione

Nell'esercitazione Wrapping delle modifiche del database all'interno di una transazione sono illustrate le tecniche per l'esecuzione di una serie di istruzioni di modifica del database nell'ambito di una transazione. Tenere presente che le modifiche eseguite sotto l'ambito di una transazione hanno esito positivo o negativo, garantendo l'atomicità. Le tecniche per l'uso delle transazioni includono:

  • Uso delle classi nello spazio dei System.Transactions nomi ,
  • Se il livello di accesso ai dati usa classi ADO.NET come SqlTransaction, e
  • Aggiunta dei comandi di transazione T-SQL direttamente all'interno della stored procedure

L'esercitazione Wrapping delle modifiche del database all'interno di una transazione ha usato le classi ADO.NET in DAL. Nella parte restante di questa esercitazione viene illustrato come gestire una transazione usando i comandi T-SQL dall'interno di una stored procedure.

I tre comandi SQL chiave per l'avvio manuale, il commit e il rollback di una transazione sono BEGIN TRANSACTIONrispettivamente , COMMIT TRANSACTIONe ROLLBACK TRANSACTION. Analogamente all'approccio ADO.NET, quando si usano transazioni dall'interno di una stored procedure, è necessario applicare il modello seguente:

  1. Indicare l'inizio di una transazione.
  2. Eseguire le istruzioni SQL che costituiscono la transazione.
  3. Se si verifica un errore in una delle istruzioni del passaggio 2, eseguire il rollback della transazione.
  4. Se tutte le istruzioni del passaggio 2 vengono completate senza errori, eseguire il commit della transazione.

Questo modello può essere implementato nella sintassi T-SQL usando il modello seguente:

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

Il modello inizia definendo un TRY...CATCH blocco, un costrutto nuovo per SQL Server 2005. Analogamente ai Try...Catch blocchi in Visual Basic, il blocco SQL TRY...CATCH esegue le istruzioni nel TRY blocco . Se un'istruzione genera un errore, il controllo viene immediatamente trasferito al CATCH blocco.

Se non sono presenti errori durante l'esecuzione delle istruzioni SQL che costituiscono la transazione, l'istruzione COMMIT TRANSACTION esegue il commit delle modifiche e completa la transazione. Se, tuttavia, una delle istruzioni genera un errore, nel ROLLBACK TRANSACTIONCATCH blocco restituisce il database al relativo stato prima dell'inizio della transazione. La stored procedure genera anche un errore usando il comando RAISERROR, che causa la generazione di un oggetto SqlException nell'applicazione.

Nota

Poiché il TRY...CATCH blocco è nuovo per SQL Server 2005, il modello precedente non funzionerà se si usano versioni precedenti di Microsoft SQL Server.

Esaminiamo un esempio concreto. Esiste un vincolo di chiave esterna tra le Categories tabelle e Products , vale a dire che ogni CategoryID campo della tabella deve eseguire il Products mapping a un CategoryID valore nella Categories tabella. Qualsiasi azione che viola questo vincolo, ad esempio il tentativo di eliminare una categoria con prodotti associati, comporta una violazione del vincolo di chiave esterna. Per verificarlo, rivedere l'esempio Di aggiornamento ed eliminazione di dati binari esistenti nella sezione Working with Binary Data (~/BinaryData/UpdatingAndDeleting.aspx). Questa pagina elenca ogni categoria nel sistema insieme ai pulsanti Modifica ed Elimina (vedere la figura 13), ma se si tenta di eliminare una categoria con prodotti associati, ad esempio Bevande, l'eliminazione non riesce a causa di una violazione del vincolo di chiave esterna (vedere la figura 14).

Ogni categoria viene visualizzata in un controllo GridView con pulsanti Modifica ed Elimina

Figura 13: Ogni categoria viene visualizzata in un controllo GridView con pulsanti modifica ed eliminazione (fare clic per visualizzare l'immagine a dimensione intera)

Non è possibile eliminare una categoria con prodotti esistenti

Figura 14: Non è possibile eliminare una categoria con prodotti esistenti (fare clic per visualizzare l'immagine a dimensione intera)

Si supponga, tuttavia, di voler consentire l'eliminazione delle categorie indipendentemente dal fatto che siano associati prodotti. Se una categoria con prodotti deve essere eliminata, si supponga di voler eliminare anche i prodotti esistenti (anche se un'altra opzione consiste nell'impostare semplicemente i valori dei prodotti CategoryID su NULL). Questa funzionalità può essere implementata tramite le regole a catena del vincolo di chiave esterna. In alternativa, è possibile creare una stored procedure che accetta un @CategoryID parametro di input e, quando viene richiamato, elimina in modo esplicito tutti i prodotti associati e quindi la categoria specificata.

Il primo tentativo di una stored procedure di questo tipo potrebbe essere simile al seguente:

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

Anche se questo eliminerà sicuramente i prodotti e la categoria associati, non lo fa sotto l'ombrello di una transazione. Si supponga che sia presente un altro vincolo di chiave esterna su Categories cui impedirebbe l'eliminazione di un determinato @CategoryID valore. Il problema è che in questo caso tutti i prodotti verranno eliminati prima di tentare di eliminare la categoria. Il risultato netto è che per tale categoria, questa stored procedure rimuove tutti i relativi prodotti mentre la categoria è rimasta perché contiene ancora record correlati in un'altra tabella.

Se la stored procedure è stata sottoposta a wrapping all'interno dell'ambito di una transazione, tuttavia, le eliminazioni alla Products tabella verranno ripristinate in caso di eliminazione non riuscita in Categories. Lo script della stored procedure seguente usa una transazione per garantire l'atomicità tra le due DELETE istruzioni:

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

Aggiungere la Categories_Delete stored procedure al database Northwind. Fare riferimento al passaggio 1 per istruzioni sull'aggiunta di stored procedure a un database.

Passaggio 6: Aggiornamento diCategoriesTableAdapter

Anche se è stata aggiunta la Categories_Delete stored procedure al database, IL È attualmente configurato per l'uso di istruzioni SQL ad hoc per eseguire l'eliminazione. È necessario aggiornare e indicare all'utente CategoriesTableAdapter di usare invece la Categories_Delete stored procedure.

Nota

In precedenza in questa esercitazione si usava DataSet NorthwindWithSprocs . Tuttavia, DataSet ha solo una singola entità, ProductsDataTable, ed è necessario usare le categorie. Pertanto, per il resto di questa esercitazione quando si parla del livello di accesso ai dati si fa riferimento a Northwind DataSet, quello creato per la prima volta nell'esercitazione Creazione di un livello di accesso ai dati .

Aprire Northwind DataSet, selezionare e CategoriesTableAdapterpassare alla Finestra Proprietà. Il Finestra Proprietà elenca le informazioni di InsertCommandconnessione , UpdateCommand, DeleteCommande SelectCommand usate da TableAdapter, nonché il nome e le informazioni di connessione. Espandere la DeleteCommand proprietà per visualizzarne i dettagli. Come illustrato nella figura 15, la DeleteCommand proprietà s CommandType è impostata su Text, che indica di inviare il testo nella CommandText proprietà come query SQL ad hoc.

Selezionare categoriesTableAdapter nel Designer per visualizzarne le proprietà nella finestra Proprietà

Figura 15: Selezionare nella CategoriesTableAdapter Designer per visualizzarne le proprietà nella finestra Proprietà

Per modificare queste impostazioni, selezionare il testo (DeleteCommand) nel Finestra Proprietà e scegliere (Nuovo) dall'elenco a discesa. Verranno cancellate le impostazioni per le CommandTextproprietà , CommandTypee Parameters . Impostare quindi la CommandType proprietà su StoredProcedure e quindi digitare il nome della stored procedure per (CommandTextdbo.Categories_Delete). Se si è certi di immettere le proprietà in questo ordine, innanzitutto CommandType e quindi , CommandText Visual Studio popola automaticamente l'insieme Parameters. Se non si immettono queste proprietà in questo ordine, sarà necessario aggiungere manualmente i parametri tramite l'insieme Parameters Editor. In entrambi i casi, è consigliabile fare clic sui puntini di sospensione nella proprietà Parameters per visualizzare l'insieme Parameters Editor per verificare che siano state apportate le modifiche corrette alle impostazioni dei parametri (vedere la figura 16). Se nella finestra di dialogo non vengono visualizzati parametri, aggiungere manualmente il @CategoryID parametro (non è necessario aggiungere il @RETURN_VALUE parametro).

Assicurarsi che le impostazioni dei parametri siano corrette

Figura 16: Assicurarsi che le impostazioni dei parametri siano corrette

Dopo l'aggiornamento di DAL, l'eliminazione di una categoria eliminerà automaticamente tutti i prodotti associati e lo eseguirà sotto l'ambito di una transazione. Per verificarlo, tornare alla pagina Aggiornamento ed eliminazione di dati binari esistenti e fare clic sul pulsante Elimina per una delle categorie. Con un solo clic del mouse, la categoria e tutti i relativi prodotti associati verranno eliminati.

Nota

Prima di testare la Categories_Delete stored procedure, che eliminerà un certo numero di prodotti insieme alla categoria selezionata, potrebbe essere consigliabile creare una copia di backup del database. Se si usa il NORTHWND.MDF database in App_Data, è sufficiente chiudere Visual Studio e copiare i file MDF e LDF in App_Data un'altra cartella. Dopo aver testato la funzionalità, è possibile ripristinare il database chiudendo Visual Studio e sostituendo i file MDF e LDF correnti in App_Data con le copie di backup.

Riepilogo

Anche se la procedura guidata tableAdapter genererà automaticamente stored procedure, in alcuni casi è possibile che tali stored procedure siano già state create o che si vogliano crearle manualmente o con altri strumenti. Per soddisfare tali scenari, è anche possibile configurare TableAdapter in modo che punti a una stored procedure esistente. In questa esercitazione è stato illustrato come aggiungere manualmente stored procedure a un database tramite l'ambiente di Visual Studio e come collegare i metodi di TableAdapter a queste stored procedure. Sono stati anche esaminati i comandi e il modello di script T-SQL usati per avviare, eseguire il commit e il rollback delle transazioni dall'interno di una stored procedure.

Buon programmatori!

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, lavora con le tecnologie Web Microsoft dal 1998. Scott lavora come consulente indipendente, formatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2.0 in 24 ore. Può essere raggiunto all'indirizzo mitchell@4GuysFromRolla.com. o tramite il suo blog, disponibile all'indirizzo http://ScottOnWriting.NET.

Grazie speciale a

Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali di questa esercitazione sono stati Hilton Geisenow, S ren Jacob Lauritsen e Teresa Murphy. Si è interessati a esaminare i prossimi articoli MSDN? In tal caso, rilasciami una riga in mitchell@4GuysFromRolla.com.