如何:调试 SQL CLR 存储过程
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
学习版 |
||||
Visual Studio 专业版、Visual Studio 高级专业版 和 Visual Studio 旗舰版 |
您可以按照调试 Transact-SQL 过程的方式,通过使用直接数据库调试来调试现有的 SQL Server 公共语言运行时 (SQL CLR) 存储过程。 不过,这不能如果您需要创建或修改 SQL CLR 过程,因为您需要编译和部署它。这些步骤,不存在为Transact-SQL过程。 在这种情况下,需要在 Visual Studio 中创建 SQL Server 项目。
以下任务在 AdventureWorks 数据库(与 SQL Server 2005 一起安装的数据库之一)中创建新的 SQL CLR 存储过程,然后演示如何调试该过程。 您将创建一个向 Sales.Currency 表中添加一种新货币的存储过程。
本示例重点介绍 SQL Server 项目的内部调试。 一旦创建了存储过程,就可以使用直接数据库调试来调试该存储过程。 有关更多信息,请参见How to: Step into an Object Using Server Explorer。
提示
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。
如果在尝试调试 SQL CLR 对象时,显示消息“被用户取消”,您必须手动配置运行 Visual Studio 的计算机以及运行 SQL Server 的计算机。 有关更多信息,请参见如何:配置计算机以启用 Transact-SQL 和 SQL CLR 调试。
调试 SQL CLR 存储过程
启用远程调试。 有关更多信息,请参见如何:设置远程调试。
在新的 SQL Server 项目中,建立一个到 AdventureWorks 示例数据库的连接。 有关更多信息,请参见How to: Connect to a Database。
使用下面第一个示例部分中的代码创建一个新的存储过程,并将它命名为“InsertCurrency.cs”。 有关更多信息,请参见How to: Develop with the SQL Server Project Type。
添加一个通过调用该存储过程来测试它的脚本。 在**“解决方案资源管理器”中右击“TestScripts”目录,单击“添加测试脚本”,然后插入下面第二个示例部分中的代码。 以名称“InsertCurrency.sql”保存文件。 右击该文件名,然后单击“设置为默认调试脚本”**。
在 InsertCurrency.cs 中设置断点,然后在**“调试”菜单上,单击“启动”**以对该项目进行编译、部署和单元测试。 以黄色箭头表示的说明性指针在断点上显示时,说明正在调试存储过程。
尝试各种调试功能。
打开**“局部变量”窗口,并在“调试”菜单上,单击“单步执行”以单步执行存储过程中的一行。 注意,“局部变量”**窗口中的变量 @mynvarchar 的值已经更改,并且它的值现在显示为红色,表示它已经更改。 有关更多信息,请参见使用“局部变量”窗口。
提示
服务器可能不会反映在调试器窗口中对变量值的更改。 有关更多信息,请参见 SQL 调试限制。
打开**“监视”窗口。 在“文本编辑器”中,拖动 InsertCurrencyCommand 变量到“监视”**窗口中的任意位置。
该变量随即添加到受监视的变量列表中。 有关更多信息,请参见如何:使用调试器变量窗口。
注意 也可以在**“监视”**窗口中编辑变量的值。
在文本编辑器中,右击 InsertCurrencyCommand.ExecuteNonQuery 行,然后在快捷菜单上单击**“插入断点”**。
在**“调试”菜单中单击“继续”**,调试器将运行代码直到新的断点。
再次单击**“继续”**完成对存储过程的调试。
**“输出”**窗口会显示一条消息,表明已成功部署存储过程,并会显示执行 InsertCurrency.sql 文件中的命令的结果。
示例
用此代码替换存储过程模板。
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;
public partial class StoredProcedures
{
[SqlProcedure]
public static void InsertCurrency(SqlString currencyCode,
SqlString name)
{
using(SqlConnection conn = new SqlConnection("context connection=true")) {
SqlCommand cmd = new SqlCommand([your SQL statement], conn);
}
InsertCurrencyCommand.CommandText = "insert Sales.Currency"
+ " (CurrencyCode, Name, ModifiedDate) values('"
+ currencyCode.ToString() + "', '"
+ name.ToString() + "', '"
+ DateTime.Now.ToString() + "')";
InsertCurrencyCommand.ExecuteNonQuery();
}
}
这是用于执行存储过程的测试脚本。
- Delete any row that might exist with a key value
- that matches the one we are going to insert
DELETE Sales.Currency
WHERE CurrencyCode = 'eee'
EXEC InsertCurrency 'eee', 'MyCurr4'
SELECT * FROM Sales.Currency WHERE CurrencyCode = 'eee'
请参见
任务
如何:通过使用公共语言运行时集成创建和运行 SQL Server 存储过程