亲爱的朋友们,阅读过上一篇文章 “ 如何从 CLR 存储过程传回表格结果与讯息(上) 之后,相信大家已经了解如何使用 SqlPipe 对象的 Send 方法将文字串直接传送至用户端。接下来我们将示范如何使用 SqlPipe 对象的 ExecuteAndSend 方法来执行 SqlCommand 并将查询结果直接传送至用户端: <?xml:namespace prefix = o />

 


q          类别库项目 SendYouResultSet 实作 CLR 存储过程,示范如何使用 SqlPipe 对象的 ExecuteAndSend 方法将查询结果直接传送至用户端。事实上,它会接收两个数值参数,以便查询出 “ 章立民研究室 数据 表中介于该薪资范围的员工资料:

using 
    Microsoft.SqlServer.Server; 
   

 
   namespace 
    SendYouResultSet 
   
 
   { 
   
 
   public class SendYouResultSetClass 
   
 
     
   { 
   
 
   SqlProcedure()] 
   
 
   public static void 
   
 
       decimal, decimal) 
   
 
     { 
   
 
      SqlCommand 
   
 
       
   
 
   //  
   使用内容连接来进行连接。 
   
 
       
   using 
   SqlConnection 
   
 
   new SqlConnection("context connection=true")) 
   
 
      { 
   
 
       connection.Open(); 
   
 
        
   
 
   new SqlCommand( 
   
 
   "SELECT  
   员工编号 
   , 
   姓名 
   , 
   目前薪资 
   FROM dbo. 
   章立民研究室 
   " 
    + 
   
 
   "WHERE  
   目前薪资 
   BETWEEN @LowerSalary AND @HigherSalary" 
   ,  
   
 
         connection); 
   
 
   "@LowerSalary", LowerSalary); 
   
 
   "@HigherSalary", HigherSalary); 
   
 
        
   
 
       //  
   调用 
   ExecuteAndSend  
   方法执行 
   SqlCommand  
   
 
       //  
   并查询结果直接传送给用户端 
   
 
        
   SqlContext 
   .Pipe.ExecuteAndSend(command); 
   
 
      } 
   
 
     } 
   
 
    } 
   
 
   }



请大家注意,此 CLR 存储过程的两个参数都是输入参数,因此使用传值方式来传递。另外请特别注意, CLR 存储过程是使用 内容连接 来连接至 SQL Server (亦即程序中的 SqlConnection("context connection=true") )。



q          请继续执行如下所列之 SQL 指令码,登录组件 SendYouResultSet.dll 、建立一个引用所登录之组件 SendYouResultSet.dll 的存储过程,最后启动此 CLR 存储过程。从图表 1 的执行画面可以看出, SQL Server 2005 成功利用组件所建构之 CLR 存储过程,透过 SqlPipe 对象来执行 SqlCommand 并将查询结果直接传送至前端:

USE 
     
   北风贸易 
   ; 
   
 
   GO 
   

 
   IF 
   EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'SendYouResultSet') 
   
 
   DROP 
   PROCEDURE SendYouResultSet; 
   
 
   GO 
   

 
   IF 
   EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'SendYouResultSet') 
   
 
   DROP 
   ASSEMBLY SendYouResultSet; 
   
 
   GO 
   

 
   --  
   登录组件 
   SendYouResultSet.dll 
   
 
   CREATE 
   ASSEMBLY 
   
 
   FROM 
     
   
 
   'C:\SQL2005Demo\CH13\SendYouResultSet\SendYouResultSet\bin\SendYouResultSet.dll' 
   
 
   WITH 
   = Safe; 
   
 
   GO 
   

 
   --  
   建立一个会引用所登录之组件 
   SendYouResultSet.dll  
   的存储过程 
   
 
   CREATE 
   PROCEDURE dbo.SendYouResultSet 
   
 
   ( 
   
 
   money, @HigherSalary money 
   
 
   ) 
   
 
   AS 
   EXTERNAL NAME 
   
 
   SendYouResultSet.[SendYouResultSet.SendYouResultSetClass].SendYouResultSet; 
   
 
   GO 
   

 
   EXEC 
   sp_configure 'clr enabled', '1'; 
   
 
   GO 
   
 
   RECONFIGURE 
   ; 
   
 
   GO 
   

 
   DECLARE 
         
   @return_value int 
   

 
   --  
   执行 
   CLR  
   存储过程 
   
 
   EXECUTE 
   = dbo.SendYouResultSet 
   
 
   = 50000, 
   
 
   = 70000;



sql server 所有表数据行数 sql server 表格_前端



                                                 图1



 



参考书籍:
《SQL Server 2005 完全实战》《Visual C# 2005 文件 IO 与资料存取秘诀》

章立民研究室敬上