Exemplarische Vorgehensweise: Debuggen eines benutzerdefinierten SQL/CLR-Typs
Aktualisiert: November 2007
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
||||
Standard |
||||
Pro und Team |
Tabellenlegende:
Vorhanden |
|
Nicht vorhanden |
|
Befehl oder Befehle, die standardmäßig ausgeblendet sind. |
In diesem Beispiel wird veranschaulicht, wie ein benutzerdefinierter SQL/CLR-Typ gedebuggt wird. Dabei wird ein neuer SQL/CLR-Typ in der Beispieldatenbank AdventureWorks erstellt. Der Typ wird dann in einer Tabellendefinition, einer INSERT-Anweisung und schließlich in einer SELECT-Anweisung verwendet.
Hinweis: |
---|
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen. |
So debuggen Sie einen benutzerdefinierten CLR/SQL-Typ
Stellen Sie in einem neuen SQL Server-Projekt eine Verbindung zur Beispieldatenbank AdventureWorks her. Weitere Informationen finden Sie unter Gewusst wie: Herstellen einer Verbindung zu einer Datenbank.
Erstellen Sie mit dem Code aus dem ersten Beispielabschnitt unten einen neuen Typ mit dem Namen Point.cs. Weitere Informationen finden Sie unter Gewusst wie: Entwickeln mit dem SQL Server-Projekttyp.
Fügen Sie ein Skript hinzu, das den Typ testet. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Verzeichnis TestScripts, klicken Sie auf Testskript hinzufügen, und fügen Sie den Code aus dem zweiten Beispielabschnitt (siehe unten) ein. Speichern Sie die Datei unter dem Namen Point.sql. Klicken Sie mit der rechten Maustaste auf den Dateinamen, und klicken Sie auf Als Standardskript zum Debuggen festlegen.
Fügen Sie Haltepunkte hinzu.
Öffnen Sie im Server-Explorer im Ordner Typen das Feld Point.
Fügen Sie einen Haltepunkt in jede Methode ein, damit Sie die Ablaufsteuerung innerhalb des Typs verfolgen können.
Klicken Sie im Menü Debuggen auf Starten, um das Projekt zu kompilieren, bereitzustellen und einem Komponententest zu unterziehen. Wenn der durch einen gelben Pfeil gekennzeichnete Anweisungszeiger am Haltepunkt angezeigt wird, wurde das Debuggen der Funktion gestartet.
Testen Sie verschiedene Debugfeatures.
Die Parse-Methode wird einmal pro INSERT-Anweisung im Skript Point.sql ausgeführt. Wenn Sie im Menü Debuggen wiederholt auf Einzelschritt klicken, können Sie beobachten, wie die Methode ein durch Doppelpunkt getrenntes Zahlenpaar in ein Point-Objekt konvertiert.
Öffnen Sie im Fenster Lokal die Variable pt, die den aktuell erstellten Point enthält.
Doppelklicken Sie im Text-Editor auf die Variable pt, um sie auszuwählen. Ziehen Sie pt an eine beliebige Position innerhalb des Überwachungsfensters. pt wird nun der Liste der überwachten Variablen hinzugefügt und kann beobachtet werden, während der Point konstruiert wird.
Gehen Sie die Klasse einige Male durch, und achten Sie auf den unterschiedlichen Verlauf von INSERT und SELECT.
Klicken Sie nochmals auf Weiter, um das Debuggen der Funktion abzuschließen.
Beispiel
Dies ist der Code, der den in diesem Beispiel verwendeten Typ definiert. Dieser Code erstellt eine Tabelle mit dem Namen Points, fügt darin Zeilen ein und druckt den Tabelleninhalt. Beachten Sie, dass Sie den Batchbefehl GO zwischen dem Erstellen der Tabelle und dem Zugriff darauf nicht benötigen. Tatsächlich wird GO von Visual Studio 2005 sogar als ungültiger SQL-Befehl interpretiert.
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; }
}
}
Dies ist das Testskript, das die Funktion aufruft.
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
Siehe auch
Aufgaben
Gewusst wie: Erstellen und Ausführen eines benutzerdefinierten CLR-SQL Server-Typs