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 |
||||
Standard |
||||
Pro e Team |
Legenda tabella:
Applicabile |
|
Non applicabile |
|
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
In un nuovo progetto SQL Server stabilire una connessione al database AdventureWorks. Per ulteriori informazioni, vedere Procedura: connettersi a un database.
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.
Creare una stored procedure CLR SQL utilizzando il codice della seconda sezione relativa agli esempi e denominarla DeleteCurrency.cs.
Creare una stored procedure CLR SQL utilizzando il codice della terza sezione relativa agli esempi e denominarla DeleteCurrencyDriver.
Scegliere Avvia dal menu Debug per compilare e distribuire queste modifiche nel database AdventureWorks.
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.
Creare un nuovo progetto console in Visual Studio.
Incollare il codice del quarto esempio nell'editor di testo.
Inserire punti di interruzione prima e dopo ciascuna chiamata a una stored procedure.
Premere F5 per eseguire l'applicazione.
Scorrere i diversi moduli.
Provare a rimuovere alcuni dei punti di interruzione per verificare l'effetto del tentativo di passare tra i diversi livelli e linguaggi.
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