Procédure pas à pas : débogage d'un type SQL CLR défini par l'utilisateur
Cette rubrique s'applique à :
Édition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
||||
Standard |
||||
Pro et Team |
Cet exemple explique comment déboguer un type CLR SQL (Common Language Run-time) SQL Server défini par l'utilisateur. Il crée un type CLR SQL dans l'exemple de base de données AdventureWorks. Le type est ensuite utilisé dans une définition de table, une instruction INSERT, puis une instruction SELECT.
Si, lorsque vous essayez de déboguer un objet CLR SQL, le message « Annulé par l'utilisateur » s'affiche, vous devez manuellement configurer à la fois l'ordinateur sur lequel vous exécutez Visual Studio et celui qui exécute SQL Server. Pour plus d'informations, consultez Comment : configurer vos ordinateurs pour activer le débogage Transact-SQL et CLR SQL.
Notes
Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Utilisation des paramètres.
Pour déboguer un type CLR SQL défini par l'utilisateur
Dans un nouveau projet SQL CLR, établissez une connexion à l'exemple de base de données AdventureWorks. Pour plus d'informations, consultez How to: Connect to a Database.
Créez un type à l'aide du code de la première section de l'exemple ci-après et nommez-le Point.cs. Pour plus d'informations, consultez How to: Develop with the SQL Server Project Type.
Ajoutez un script qui teste le type. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le répertoire TestScripts, cliquez sur Ajouter un script de test et insérez le code de la deuxième section d'exemple ci-dessous. Enregistrez le fichier sous le nom Point.sql. Cliquez avec le bouton droit sur le nom du fichier et cliquez sur Définir comme script de débogage par défaut.
Ajouter des points d'arrêt.
Dans le dossier Types de l'Explorateur de serveurs, ouvrez Point.
Placez un point d'arrêt dans chaque méthode afin de pouvoir observer le flux de contrôle à l'intérieur du type.
Dans le menu Déboguer, choisissez Démarrer pour compiler, déployer et effectuer un test unitaire du projet. L'apparition du pointeur d'instruction (désigné par une flèche jaune) sur le point d'arrêt signifie que vous êtes en train de déboguer votre fonction.
Testez différentes fonctionnalités de débogage.
La méthode Parse s'exécute une fois pour chaque instruction INSERT du script dans Point.sql. En cliquant à plusieurs reprises sur Pas à pas détaillé dans le menu Déboguer, vous pouvez surveiller la façon dont la méthode convertit une paire de nombres délimités par deux-points en un objet Point.
Dans la fenêtre Variables locales, ouvrez la variable pt contenant le Point actuel en cours de génération.
Dans l'Éditeur de texte, double-cliquez sur la variable pt pour la sélectionner. Faites glisser pt n'importe où dans la fenêtre Espion. pt est maintenant ajoutée à la liste des variables espionnées, et vous pouvez l'espionner pendant la génération du Point.
Exécutez la classe pas à pas plusieurs fois et observez les différences entre les chemins d'accès empruntés par un INSERT et un SELECT.
Choisissez de nouveau Continuer pour terminer le débogage de la fonction.
Exemple
Voici le code servant à définir le type utilisé dans cet exemple. Ce code crée une table nommée Points, y insère des lignes et affiche son contenu. Notez que vous ne devez pas inclure la commande batch GO entre la création de la table et son accès. D'ailleurs, Visual Studio 2005 interprétera la commande GO comme une commande SQL non valide.
using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.Serialization;
[Serializable, SqlUserDefinedTypeAttribute(Format.Native)]
public struct Point: INullable
{
private bool m_isNull;
private double m_x;
private double m_y;
public bool IsNull {
get { return (m_isNull); }
}
public override string ToString()
{
if (this.IsNull) { return "NULL"; }
else { return this.m_x + ":" + this.m_y; }
}
public static Point Parse(SqlString s)
{
if (s.IsNull) { return Null; }
else
{
// Parse input string here to separate out points:
Point pt = new Point();
string str = Convert.ToString(s);
string[] xy = str.Split(':');
pt.X = Convert.ToDouble(xy[0]);
pt.Y = Convert.ToDouble(xy[1]);
return (pt);
}
}
public static Point Null
{
get
{
Point pt = new Point();
pt. m_isNull = true;
return (pt);
}
}
public double X
{
get { return (this.m_x); }
set { m_x = value; }
}
public double Y
{
get { return (this.m_y); }
set { m_y = value; }
}
}
Voici le script de test qui appelle la fonction.
CREATE TABLE dbo.Points (
ID int IDENTITY(1,1) PRIMARY KEY,
Pnt Point)
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '3:4'))
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '-1:5'))
INSERT INTO dbo.Points (Pnt) VALUES (CAST ('1:99' AS Point))
SELECT ID,
Pnt.ToString() as StringPoint,
Pnt.X as X,
Pnt.Y as Y
FROM dbo.Points