Condividi tramite


Procedura: eseguire il debug di un'applicazione di database a più livelli

Aggiornamento: novembre 2007

Le informazioni contenute in questo argomento sono valide per:

Edition

Visual Basic

C#

C++

Web Developer

Express

Argomento non applicabile Argomento non applicabile Argomento non applicabile Argomento non applicabile

Standard

Argomento non applicabile Argomento non applicabile Argomento non applicabile Argomento non applicabile

Pro e Team

Argomento applicabile Argomento applicabile Argomento applicabile Argomento applicabile

Legenda tabella:

Argomento applicabile

Applicabile

Argomento non applicabile

Non applicabile

Argomento valido ma comando nascosto per impostazione predefinita

Comando o comandi nascosti per impostazione predefinita.

In questo argomento viene fornito codice di esempio per illustrare il debug di un'applicazione a più livelli e vengono descritti i passaggi necessari per eseguire il debug da un codice di applicazione che risiede in un'applicazione client o di livello intermedio in un codice per un oggetto database eseguito all'interno di SQL Server 2005.

Le transizioni tra il livello dell'applicazione e il livello del database necessitano di un punto di interruzione al livello di destinazione. In caso contrario il codice verrà semplicemente eseguito senza interruzioni quando si tenta di eseguire l'istruzione nel livello. Ma le transizioni tra il codice T-SQL e CLR SQL all'interno del livello del database non necessitano di punti di interruzione per attivare il passaggio tra loro.

Nell'esempio riportato di seguito viene utilizzato il database AdventureWorks e vengono effettuati passaggi tra i diversi livelli e linguaggi. Con questo esempio si intende illustrare tali transizioni, senza rappresentare uno scenario aziendale reale.

Vengono chiamate tre stored procedure:

  • DeleteCurrency è una stored procedure CLR SQL che elimina una valuta con un determinato codice di valuta.

  • DeleteCurrency_T_SQL effettua la stessa operazione, ma è scritta in T-SQL.

  • DeleteCurrencyDriver chiama le due stored procedure precedenti con un parametro di input che specifica il codice di valuta da eliminare.

Nel codice di applicazione vengono chiamate le tre stored procedure, passando un parametro di codice di valuta. Le due stored procedure "non driver" vengono chiamate da due diversi contesti, ovvero da DeleteCurrencyDriver e direttamente dall'applicazione. Nel primo contesto sarà possibile eseguire istruzioni da DeleteCurrencyDriver nelle altre due stored procedure. Quando invece le stored procedure vengono chiamate dall'applicazione, non è possibile eseguirne le istruzioni direttamente ed è necessario impostare punti di interruzione all'interno delle stored procedure.

Eseguire il debug di un'applicazione database

  1. In un nuovo progetto SQL Server stabilire una connessione al database AdventureWorks. Per ulteriori informazioni, vedere Procedura: connettersi a un database.

  2. Creare una stored procedure T-SQL utilizzando il codice contenuto nella prima sezione relativa agli esempi e denominarla DeleteCurrency_T_SQL.Per ulteriori informazioni su questa o altre operazioni di questa procedura, vedere Procedura: sviluppare con il tipo di progetto SQL Server.

  3. Creare una stored procedure CLR SQL utilizzando il codice della seconda sezione relativa agli esempi e denominarla DeleteCurrency.cs.

  4. Creare una stored procedure CLR SQL utilizzando il codice della terza sezione relativa agli esempi e denominarla DeleteCurrencyDriver.

  5. Scegliere Avvia dal menu Debug per compilare e distribuire queste modifiche nel database AdventureWorks.

  6. Impostare almeno un punto di interruzione in ciascuna stored procedure. Non sarà possibile eseguire l'istruzione di una stored procedure da codice nativo o gestito.

  7. Creare un nuovo progetto console in Visual Studio.

  8. Incollare il codice del quarto esempio nell'editor di testo.

  9. Inserire punti di interruzione prima e dopo ciascuna chiamata a una stored procedure.

  10. Premere F5 per eseguire l'applicazione.

  11. Scorrere i diversi moduli.

  12. Provare a rimuovere alcuni dei punti di interruzione per verificare l'effetto del tentativo di passare tra i diversi livelli e linguaggi.

  13. Per terminare il debug, cancellare tutti i punti di interruzione dal menu Debug di Visual Studio e premere F5.

Esempio

In questa sezione viene presentato il codice per la stored procedure T-SQL.

CREATE PROCEDURE dbo.DeleteCurrency_T_SQL
    (
        @CurrencyCode nvarchar(3)
    )
AS
    SET NOCOUNT ON
    DELETE Sales.Currency 
    WHERE CurrencyCode = @currencyCode 
    RETURN

Questo codice contiene il codice per la stored procedure CLR SQL chiamata da una stored procedure del driver.

using System;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
 
public partial class StoredProcedures
{
    [SqlProcedure]
    public static void DeleteCurrency(SqlString currencyCode)
    {
        string sCmd = "DELETE Sales.Currency WHERE CurrencyCode = '" + currencyCode.Value + "'";
        SqlConnection conn = new SqlConnection("Context Connection=True");
        conn.Open();
        SqlCommand  DeleteCurrencyCommand = new  SqlCommand( sCmd , conn);
        DeleteCurrencyCommand.ExecuteNonQuery();
    }
}

Questo codice contiene il codice per la stored procedure del driver CLR SQL che chiama altre stored procedure. Questa stored procedure viene chiamata dal livello dell'applicazione.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
 
public partial class StoredProcedures
{
    [SqlProcedure]
    public static void DeleteCurrencyDriver(SqlString CurrencyCode)
    {
        string sCommand = "DELETE Sales.Currency WHERE CurrencyCode = '" + CurrencyCode.Value + "'";
        SqlConnection conn = new SqlConnection("Context Connection=True");
        conn.Open();
        SqlCommand DeleteCurrencyCommand = new SqlCommand(sCommand, conn);
        DeleteCurrencyCommand.ExecuteNonQuery();
 
        // Now execute a T-SQL stored procedure.
        DeleteCurrencyCommand.CommandType = CommandType.StoredProcedure;
        DeleteCurrencyCommand.CommandText = "DeleteCurrency_T_SQL";
        // Fill the parameters collection based upon stored procedure.
        SqlParameter workParam = null;
        workParam = DeleteCurrencyCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 3);
        DeleteCurrencyCommand.Parameters["@CurrencyCode"].Value = "ESC";
        try { DeleteCurrencyCommand.ExecuteNonQuery(); }
        catch { }
 
        // Now execute a CLR stored procedure.
        DeleteCurrencyCommand.CommandText = "DeleteCurrency";
        try { DeleteCurrencyCommand.ExecuteNonQuery(); }
        catch { }
    }
};

Questo codice contiene il codice di applicazione che chiamerà la stored procedure del driver, nonché direttamente le stored procedure T-SQL e CLR SQL.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = <server>;
            builder.IntegratedSecurity = true;
            builder.InitialCatalog = <database>;
 
            SqlConnection SqlConnection1 = new SqlConnection(builder.ConnectionString);
            SqlConnection1.Open();
 
            SqlCommand procCommand = new SqlCommand();
 
            procCommand.CommandText = "DeleteCurrencyDriver";
            procCommand.CommandType = CommandType.StoredProcedure;
            procCommand.Connection = SqlConnection1;
            // Fill parameters collection for the stored procedure.
            SqlParameter workParam = null;
            workParam = procCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 3);
            procCommand.Parameters["@CurrencyCode"].Value = "ESC";
            
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { DumpException(e); }
 
            procCommand.CommandText = "DeleteCurrency";
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { DumpException(e); }
 
            procCommand.CommandText = "DeleteCurrency_T_SQL";
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { DumpException(e); }
 
            SqlConnection1.Close();
        }
        static void DumpException(SqlException e)
       {
            string errorMessages = "";
            for (int i = 0; i < e.Errors.Count; i++)
           {
                errorMessages += "Index #" + i + "\n" +
                       "Message: " + e.Errors[i].Message + "\n" +
                       "LineNumber: " + e.Errors[i].LineNumber + "\n" +
                       "Source: " + e.Errors[i].Source + "\n" +
                       "Procedure: " + e.Errors[i].Procedure + "\n";
            }
            System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
            log.Source = "My Application";
            log.WriteEntry(errorMessages);
            Console.WriteLine("An exception occurred. Please contact your system administrator.");
        }
    }
}

Vedere anche

Attività

Procedura: attivare il debug SQL per un progetto

Procedura: attivare il debug a più livelli

Procedura: attivare il debug CLR per una connessione

Procedura: attivare il debug di SQL Server 2005