演练:调试 SQL CLR 用户定义的类型
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
||||
标准版 |
||||
专业团队版 |
表格图例:
适用 |
|
不适用 |
|
默认情况下隐藏的一条或多条命令。 |
此示例演示如何调试 SQL CLR 用户定义的类型。它在 AdventureWorks 示例数据库中创建一个新的 SQL CLR 类型。该类型随后用于表定义、INSERT 语句以及 SELECT 语句中。
说明: |
---|
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 |
调试 CLR SQL 用户定义的类型
在一个新的 SQL Server 项目中,建立一个到 AdventureWorks 示例数据库的连接。有关更多信息,请参见如何:连接到数据库。
使用下面第一个示例部分中的代码创建一个新的类型,并将其命名为“Point.cs”。有关更多信息,请参见 如何:使用 SQL Server 项目类型进行开发。
添加测试该类型的脚本。在“解决方案资源管理器”中,右击“TestScripts”目录,单击“添加测试脚本”,然后插入下面的第二个示例部分中的代码。以“Point.sql”名称保存文件。右击该文件名,然后单击“设置为默认调试脚本”。
添加断点。
在“服务器资源管理器”的“类型”文件夹中,打开“Point”。
将断点放在每个方法内,以便可以观察该类型内的控制流。
从“调试”菜单中,选择“启动”对该项目进行编译、部署和单元测试。以黄色箭头表示的指令指针出现在断点上时,说明正在调试函数。
尝试不同的调试功能。
对于“Point.sql”脚本中的每条 INSERT 语句,都会执行一次 Parse 方法。通过在“调试”菜单上重复单击“逐语句”,可监视该方法如何将一个用冒号分隔的数字对转换为 Point 对象。
在“局部变量”窗口中,打开变量 pt,它包含正在生成的当前 Point。
在文本编辑器中,双击 pt 变量以选择它。将 pt 拖到“监视”窗口中的任何位置。pt 现在就添加到受监视变量的列表中了,您就可以在生成 Point 时对该变量进行观察。
逐句通过该类几次并观察 INSERT 和 SELECT 所通过的路径之间的差异。
再次按“继续”完成函数调试。
示例
这是定义此示例中所使用类型的代码。此代码创建名为 Points 的表、向其中插入行并输出表的内容。请注意,在创建表和访问表之间不必包含批命令 GO。实际上,Visual Studio 2005 会将 GO 解释为无效的 SQL 命令。
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; }
}
}
这是调用此函数的测试脚本。
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
请参见
任务
如何:创建和运行 CLR SQL Server 用户定义的类型