Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Mise à jour : novembre 2007
Cette rubrique s'applique à :
Édition |
Visual Basic |
C# |
C++ |
Web Developer |
|---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
![]() |
Standard |
![]() |
![]() |
![]() |
![]() |
Pro et Team |
![]() |
![]() |
![]() |
![]() |
Légende du tableau :
![]() |
Applicable |
![]() |
Non applicable |
![]() |
Commande ou commandes masquées par défaut. |
Cette rubrique contient un exemple de code qui montre le débogage d'une application multicouche et décrit les étapes nécessaires pour déboguer, depuis un code d'application résidant dans un client ou une application de couche intermédiaire, un code d'objet de base de données s'exécutant dans SQL Server 2005.
Les transitions entre la couche Application et la couche de base de données nécessitent un point d'arrêt dans la couche cible ; dans le cas contraire, le code s'exécute simplement sans s'arrêter lorsque vous tentez d'effectuer un pas à pas détaillé dans la couche. Mais les transitions entre T-SQL et le code CLR SQL à l'intérieur de la couche de base de données ne nécessitent pas de points d'arrêt pour activer le pas à pas détaillé entre eux.
L'exemple suivant utilise la base de données AdventureWorks et fait la navette entre les différentes couches et les différents langages. L'intention de l'exemple est d'illustrer ces transitions ; il ne s'agit pas clairement d'un véritable scénario d'entreprise.
Trois procédures stockées sont appelées :
DeleteCurrency est une procédure stockée CLR SQL qui supprime une devise avec un code devise donné.
DeleteCurrency_T_SQL fait la même chose, mais en T-SQL.
DeleteCurrencyDriver appelle les deux procédures stockées précédentes à l'aide d'un paramètre d'entrée qui spécifie le code de monnaie à supprimer.
Le code de l'application appelle la totalité des trois procédures stockées, en passant un paramètre de code de monnaie. Les deux procédures stockées « non pilotes » sont appelées à partir de deux contextes différents, de DeleteCurrencyDriver et directement à partir de l'application. Dans le premier contexte, vous pourrez effectuer un pas à pas détaillé de DeleteCurrencyDriver dans les deux autres procédures stockées. Lorsqu'elles sont appelées de l'application, vous ne pourrez pas effectuer directement un pas à pas détaillé dedans et vous devrez définir des points d'arrêt à l'intérieur des procédures stockées.
Déboguer une application de base de données
Dans un nouveau projet SQL Server, établissez une connexion à la base de données AdventureWorks. Pour plus d'informations, consultez Comment : se connecter à une base de données.
Créez une procédure stockée T-SQL à l'aide du code de la première section d'exemple ci-dessous et nommez-la DeleteCurrency_T_SQL.Pour plus d'informations sur ce point ou sur les étapes de cette procédure, consultez Comment : développer avec le type de projet SQL Server.
Créez une procédure stockée CLR SQL à l'aide du code de la deuxième section d'exemple ci-dessous et nommez-le DeleteCurrency.cs.
Créez une procédure stockée CLR SQL à l'aide du code de la troisième section d'exemple ci-dessous et nommez-la DeleteCurrencyDriver.
Dans le menu Déboguer, cliquez sur Démarrer pour compiler et déployer ces modifications de la base de données AdventureWorks.
Définissez au moins un point d'arrêt dans chaque procédure stockée. L'exécution pas à pas d'un code natif ou managé dans une procédure stockée ne fonctionnera pas.
Créez un nouveau projet console dans Visual Studio.
Collez le code du quatrième exemple dans l'éditeur de texte.
Placez des points d'arrêt avant et après chaque appel à une procédure stockée.
Exécutez l'application en appuyant sur F5.
Exécutez pas à pas les différents modules.
Essayez de supprimer quelques-uns des points d'arrêt pour voir ce que donnent les tentatives d'exécution pas à pas entre différentes couches et langages.
Pour terminer le débogage, effacez tous les points d'arrêt du menu Déboguer de Visual Studio et appuyez sur F5.
Exemple
Cette section contient le code de la procédure T-SQL stockée.
CREATE PROCEDURE dbo.DeleteCurrency_T_SQL
(
@CurrencyCode nvarchar(3)
)
AS
SET NOCOUNT ON
DELETE Sales.Currency
WHERE CurrencyCode = @currencyCode
RETURN
Ce code contient le code pour la procédure stockée CLR SQL appelée à partir d'une procédure stockée de pilote.
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();
}
}
Ce code contient le code pour la procédure pilote SQL CLR qui appelle d'autres procédures. Cette procédure stockée est appelée depuis la couche Application.
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 { }
}
};
Ce code contient le code d'application qui appelle la procédure stockée de pilote, et qui appelle directement les procédures stockées T-SQL et 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.");
}
}
}
Voir aussi
Tâches
Comment : activer le débogage SQL pour un projet
Comment : activer le débogage multicouche
.gif)
.gif)
.gif)