上一篇文章中我们了解了CLR存储过程的基本用法。
不知道大家有没有注意,在StoredProcedureTest()方法中我们使用的SqlContext.Pipe.ExecuteAndSend(cmd)语句将查询的结果集返回到客户端。SqlPipe就是本文要讲的话题。
一开始,我以为像平常使用ADO.NET那样只要执行了Select语句就可以把结果集返回到客户端。后来才发现没有我想象的那么简单,有个专门的类来把想要的数据发送到客户端,那就是SqlPipe。为了避免后来的人和我犯同样的错误,觉得有必要把SqlPipe的方法详细讲一下。
通过SqlPipe我们有5中方式传数据到客户端,具体如下:
1. ExecuteAndSend(SqlCommand)方法,执行指定的SqlCommand并将得到的结果集返回给客户端。上一篇文章中我们就使用的是这种方法:
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void StoredProcedureTest(string strTableName)
{
SqlConnection conn = new SqlConnection("context connection=true");
SqlCommand cmd = new SqlCommand("", conn);
try
{
cmd.CommandText = "select * from " + strTableName;
conn.Open();
SqlContext.Pipe.ExecuteAndSend(cmd);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
}
2. Send(String)方法,直接返回字符串到客户端。比如我们可以对Product表中的数据做一个检查,检查成功之后给一个提示信息:
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void StoredProcedureTest(string strTableName)
{
// 检查Product表的过程省略
SqlContext.Pipe.Send("Product表中的数据没有问题,不需要调整。");
}
}
3. Send(SqlDataReader)方法,将多行记录集返回到客户端。和ExecuteAndSend(SqlCommand)方法有点类似:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void StoredProcedureTest(string strTableName)
{
SqlConnection conn = new SqlConnection("context connection=true");
SqlCommand cmd = new SqlCommand("", conn);
try
{
cmd.CommandText = "select * from " + strTableName;
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
SqlContext.Pipe.Send(reader);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
4. Send(SqlDataRecord)方法,将一条记录返回到客户端。注意在New SqlMetaData时如果类型为NVarChar,一定要指定长度,否则执行存储过程时会报错。
[Microsoft.SqlServer.Server.SqlProcedure]
public static void StoredProcedureTest()
{
SqlDataRecord record = new SqlDataRecord(new SqlMetaData[] {
new SqlMetaData("Name", SqlDbType.NVarChar,255),
new SqlMetaData("Price", SqlDbType.Decimal)});
record.SetString(0, "iPhone");
record.SetDecimal(1, 5000);
SqlContext.Pipe.Send(record);
}
5. SendResultsRow(SqlDataRecord)方法,该方法需要配合SendResultsStart和SendResultsEnd使用,可将多条记录集返回到客户端。例如我们可以返回10种手机的价格列表到客户端:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void StoredProcedureTest()
{
SqlDataRecord record = new SqlDataRecord(new SqlMetaData[] {
new SqlMetaData("Name", SqlDbType.NVarChar,255),
new SqlMetaData("Price", SqlDbType.Decimal)});
SqlContext.Pipe.SendResultsStart(record);
for (int intCounter = 1; intCounter <= 10; intCounter++)
{
record.SetString(0, "Phone" + intCounter.ToString());
record.SetDecimal(1,intCounter * 1000);
SqlContext.Pipe.SendResultsRow(record);
}
SqlContext.Pipe.SendResultsEnd();
}
总结:
Send(String)和Send(SqlDataRecord)用户返回简单的数据和单条记录,ExecuteAndSend(SqlCommand)、Send(SqlDataReader)、SendResultsRow(SqlDataRecord)用于返回多行记录。后3中方法使用起来相当灵活,到底用哪一个视具体情况而定即可。
本文章由创风网发布,转载请注明出处:http://www.windite.com/article/details/t2alt96