using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;
using System.IO;
public partial class StoredProcedures
{
[SqlProcedure]
public static void usp_ReadTextFile(string sInputFile,
out SqlString sColumn)
{
string strContents;
sColumn = "";
try
{
StreamReader strReader = new StreamReader(sInputFile);
strContents = strReader.ReadToEnd();
strReader.Close();
sColumn = strContents;
}
catch (Exception ex)
{
SqlPipe sp = SqlContext.GetPipe();
sp.Send(ex.Message);
}
}
首先,我们检查一下using语句。这些语句使得程序在调用SQL Server .NET数据提供程序的命名空间中的类时,无需使用全名来引用。SQL Server .NET数据提供程序(在命名空间System.Data.SqlServer中)是用来连接SQL Server系统的。
接着,我们注意一下位于方法名称前面的[SqlProcedure]属性。这个属性的存在就告诉了.NET编译器和运行库这个方法将作为SQL Server存储过程使用。另外,你还会发现这个类的默认名称被设置为“StoredProcedures”。在这个类中包含了一个名为usp_ReadTextFile的静态方法,因为在此使用的是C#,所以这个方法必须被定义为静态的,如果你使用的是Visual Basic,这个方法就应该被定义为Shared。usp_ReadTextFile方法接收两个参数。第一个参数是输入参数,用于传递操作系统的文件名称;第二个参数是输出参数(用out关键字标志),这个参数将以SqlString数据类型的形式把文本文件的内容返回给调用者,SQLString数据类型与T-SQL varchar数据类型相对应。
考虑到有些读者可能不能读懂C#代码,我们在这先对这段代码的结构做个简要地描述:这段代码先打开一个文本文件,然后读取它的内容,接着将内容放到SqlString类型的输出变量中输出。在这个存储过程代码开始部分,先声明了一个String类型的变量用来存放文本文件的内容。接着,在Try-Catch结构中读取文件的内容,首先,创建了一个名为strReader的StreamReader类型的对象并将包含在sInputFile变量中的输入文件名传递给它,接着利用StreamReader的ReadtoEnd方法读取输入文件的全部内容并将其存入strContents变量中。在文件内容读取完毕以后,关闭StreamReader对象并将文件内容移至名为sColumn的输出变量中。
如果在读取文件内容的过程中发生了错误,Catch模块中的代码将被执行。在Catch模块中,利用了一个SqlPipe类型的对象实例将错误信息传送给这个存储过程的调用者。首先,利用SqlContext.GetPipe方法创建了一个SqlPipe类型的对象实例,然后使用SqlPipe对象的Send方法将Exception对象实例ex的Message属性的内容传送给调用存储过程usp_ReadTextFile的程序。
使用SQL Server和Visual Studio 2005构建存储过程
下面的表格中概括了使用Visual Studio 2005结合SQL Server 2005创建和部署一个CLR存储过程的所需步骤。
步骤 | 简要说明 | 所用工具 |
1 | 创建新的Visual Studio SQL Server项目 | Visual Studio 2005文件菜单 |
2 | 创建数据库连接 | SQL Server项目模板 |
3 | 添加存储过程 | 存储过程项目模板 |
4 | 生成项目 | Visual Studio 2005生成菜单 |
5 | 部署项目 | Visual Studio 2005生成菜单 |
总共5步 |
|
|


在“Connection Properties”对话框中,你可以在“Select or enter a server name”下拉框中输入你的目标SQL Server实例名称。如果在你的开发环境中注册了多个SQL Server实例,当你点击下拉箭头时,所有已注册的实例名称都会被列出。如果你的目标系统不在下拉列表中,你也可以在下拉框中输入相应的实例名称或者是IP地址。
选择好目标实例之后,你接下来需要选择用来连接这个SQL Server实例的身份验证模式。选择“Windows NT Integrated Security”,系统会把你在Windows中使用的用户名和密码传递给SQL Server用以验证并连接。如果你的目标实例没有采用集成验证模式,你也可以在“User ID”和“Password”两个文本框中提供用以连接目标实例的用户信息。
接下来,选择将作为部署目标的数据库。点击下拉框,会显示所有你有权限访问的数据库。当然,这里供你选择的数据库都已经存在于SQL Server中了。

刚刚建立的SQL Server项目最初是一个空的解决方案。在“Solution Explorer”中,所显示的项目名称就是在“New Project”对话框中设置的。另外,适当的引用文件会被自动地添加到项目中。我们特别注意一下sqlaccess引用,它是包含SQL Server .NET Provider的系统DLL,也就是说,它是我们创建和运行.NET数据库对象所必需的。

图9——添加CLR存储过程
