|
原文发布日期:2007.06.17,作者:Bipin Joshi ,翻译:webabcd 启用CLR集成
sp_configure
'
clr enabled
'
,
1
GO
RECONFIGURE
GO
这里,我们执行了系统存储过程“sp_configure”,为其提供的两个参数分别为:“clr enabled”和“1”。如果要停用CLR集成的话也是执行这个存储过程,只不过第二个参数要变为“0”而已。另外,为了使新的设置产生效果,不要忘记调用“RECONFIGURE”。
选择“存储过程”模板,并起一个合适的名字,然后单击“添加”按钮。添加完后你就会发现,实际上这是创建了一个已经导入了需要用到的命名空间的类。
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
System.Data.SqlTypes;
using
Microsoft.SqlServer.Server;
注意一下加粗显示的命名空间(译者注:后两个using)。 System.Data.SqlTypes命名空间包含了很多不同的类型,它们可以用来代替SQL Server的数据类型。 Microsoft.SqlServer.Server命名空间下的类负责SQL Server的CLR集成。
[SqlProcedure]
public
static
void
ChangeCompanyName (SqlString CustomerID, SqlString CompanyName)
{ SqlConnection cnn = new SqlConnection ( " context connection=true " ); cnn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; cmd.CommandText = " update customers set companyname = @p1 where customerid = @p2 " ; SqlParameter p1 = new SqlParameter( " @p1 " , CompanyName); SqlParameter p2 = new SqlParameter( " @p2 " , CustomerID); cmd.Parameters.Add(p1); cmd.Parameters.Add(p2); int i = cmd.ExecuteNonQuery(); cnn.Close(); SqlContext.Pipe.Send(i.ToString()); }
仔细看一下这个ChangeCompanyName()方法。 它是一个静态方法并且没有返回值(void)。它需要两个名为CustomerID和CompanyName的参数。 请注意这两个参数的数据类型都是SqlString。 SqlString可以用来代替SQL Server中的nvarchar数据类型。 这个方法用了一个[SqlProcedure]属性来修饰。该属性用于标记ChangeCompanyName()方法是一个SQL Server存储过程。
[SqlProcedure]
public
static
void
GetAllCustomers()
{ SqlConnection cnn = new SqlConnection ( " context connection=true " ); cnn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; cmd.CommandText = " select * from customers " ; SqlDataReader reader = cmd.ExecuteReader(); SqlContext.Pipe.Send(reader); reader.Close(); cnn.Close(); }
这个GetAllCustomers()方法用了一个[SqlProcedure]属性来修饰。在方法内创建一个SqlConnection和一个SqlCommand对象。 然后使用ExecuteReader()方法来执行SELECT语句。接下来用Send()方法将取得的SqlDataReader数据发送到客户端。最后就是关闭SqlDataReader和SqlConnection。 在这种方法中,是我们自己创建的SqlDataReader。其实,我们也可以把这个任务交给SqlContext类去完成,代码如下:
[SqlProcedure]
public
static
void
GetCustomerByID (SqlString CustomerID)
{ SqlConnection cnn = new SqlConnection ( " context connection=true " ); cnn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; cmd.CommandText = " select * from customers where customerid = @p1 " ; SqlParameter p1 = new SqlParameter( " @p1 " , CustomerID); cmd.Parameters.Add(p1); SqlContext.Pipe.ExecuteAndSend(cmd); cnn.Close(); }
GetCustomerByID()方法需要一个参数 – CustomerID,它将从Customers表中返回某个customer的记录。这个方法内的代码,除了ExecuteAndSend()方法外,你应该都已经比较熟悉了。 ExecuteAndSend()方法接收一个SqlCommand对象作为参数,执行它就会返回数据集给客户端。
[SqlProcedure]
public
static
void
GetCompanyName (SqlString CustomerID,
out
SqlString CompanyName)
{ SqlConnection cnn = new SqlConnection ( " context connection=true " ); cnn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; cmd.CommandText = " select companyname from customers where customerid = @p1 " ; SqlParameter p1 = new SqlParameter ( " @p1 " , CustomerID); cmd.Parameters.Add(p1); object obj = cmd.ExecuteScalar(); cnn.Close(); CompanyName = obj.ToString(); }
这是一个名为GetCompanyName()的方法,它需要两个参数。第一个参数是CustomerID,它是一个输入参数;第二个参数是CompanyName,它是一个输出参数(用关键字out来指明)。这两个参数都是SqlString类型的。 GetCompanyName()方法会接收一个CustomerID参数,然后返回CompanyName(作为输出参数)。
[SqlProcedure]
public
static
void
GetCustomRow()
{ SqlMetaData[] metadata = new SqlMetaData[ 2 ]; metadata[ 0 ] = new SqlMetaData ( " CustomerID " , SqlDbType.NVarChar, 50 ); metadata[ 1 ] = new SqlMetaData ( " CompanyName " , SqlDbType.NVarChar, 50 ); SqlDataRecord record = new SqlDataRecord(metadata); record.SetString( 0 , " ALFKI " ); record.SetString( 1 , " Alfreds Futterkiste " ); SqlContext.Pipe.Send(record); }
GetCustomRow()方法会返回一条记录并发送给客户端。 这个方法首先声明了一个SqlMetaData对象。当你要用到自定义列的时候,就可以使用这个SqlMetaData类。在我们的示例中,创建了两个类型为NVarChar,长度为50的列。然后创建了一个SqlDataRecord对象。 SqlDataRecord类可以用来表示一个自定义行。 它的构造函数需要一个SqlMetaData数组作为参数。 SqlDataRecord对象的SetString()方法用来设置列的值。另外,还有许多不同的类似SetString()这样的方法,可以用来处理不同的数据类型。最后,调用Send()方法将SqlDataRecord对象发送到客户端。
[SqlProcedure]
public
static
void
GetMultipleCustomRows()
{ SqlMetaData[] metadata = new SqlMetaData[ 2 ]; metadata[ 0 ] = new SqlMetaData ( " CustomerID " , SqlDbType.NVarChar, 50 ); metadata[ 1 ] = new SqlMetaData ( " CompanyName " , SqlDbType.NVarChar, 50 ); SqlDataRecord record = new SqlDataRecord(metadata); SqlContext.Pipe.SendResultsStart(record); record.SetString( 0 , " ALFKI " ); record.SetString( 1 , " Alfreds Futterkiste " ); SqlContext.Pipe.SendResultsRow(record); record.SetString( 0 , " ANATR " ); record.SetString( 1 , " Ana Trujillo Emparedados y helados " ); SqlContext.Pipe.SendResultsRow(record); SqlContext.Pipe.SendResultsEnd(); }
GetMultipleCustomRows()方法将会返回多个SqlDataRecord对象到客户端。接下来创建自定义列和设置列的值都和之前的例子一样。 但是,我们使用的是SendResutlsStart()方法来传输数据。 SendResultsRow()方法也是发送一个SqlDataRecord对象到客户端,但是我们可以多次调用它,从而做到发送多条记录。最后,调用SendResultsEnd()方法用来标记已经完成数据传输操作。
如果你在SQL Server Management Studio查看Northwind数据库的话,那么就应该可以看到和下图相似的结果。
注意,在存储过程节点下出现了我们创建的所有方法(有“锁”图标的),并且在程序集节点下出现了我们的程序集。 |
本文介绍如何使用 C# 开发 SQL Server 的存储过程,包括无返回值、返回记录及自定义数据等多种类型。
SqlConnection cnn
}
1万+

被折叠的 条评论
为什么被折叠?



