C#编写扩展存储过程

      Microsoft® SQL Server™ 2000支持扩展存储过程,使你可以用其他语言编写组件扩展数据库的功能。以前本地代码VC等可以在做好动态链接库后直接放到System32目录下,然后通过在master库中创建存储过程调用sp_addextendedproc来实现功能。
      .NET等托管语言编写的DLL要多做几步工作。首先托管类库要注册COM接口,而要注册COM接口就需要添加一个Interface,声明出要暴露方法,并添加GUID和DispId,例如:
None.gif  [Guid( " 200D1D86-E232-4b52-84F1-6D7FED6EA99F " )]
None.gif    
public   interface  COM_Interface
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        [DispId(
1)]
InBlock.gif        
void Show(ref long hWndParent, ref U8Login.clsLogin Login, Object mRepManage, Object mRepSysInfo);
InBlock.gif
ExpandedBlockEnd.gif    }

None.gif
None.gif    
// 排产书
None.gif
    [Guid( " CD5C1120-FEA4-4abe-AD4D-BF20686A0E05 " ), ClassInterface(ClassInterfaceType.None)]
None.gif    
public   class  COM_SoMain : COM_Interface
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
public void Show(ref long hWndParent, ref U8Login.clsLogin Login, Object mRepManage, Object mRepSysInfo)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (Func.cUser_Name == string.Empty)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Data.conn_Default 
= Login.UfDbName.Substring(Login.UfDbName.IndexOf(";"+ 1);
InBlock.gif                Func.cUser_ID 
= Login.cUserId;
InBlock.gif                Func.cUser_Name 
= Login.cUserName;                
InBlock.gif                Func.DataBaseName 
= Login.cAccName;
InBlock.gif                MessageBox.Show(Login.cUserId
+Login.cUserName+Data.conn_Default);                
ExpandedSubBlockEnd.gif            }

InBlock.gif            
new FormLayer.SaleOrder.SaleOrderList(0,true);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
COM_Interface 成员#region COM_Interface 成员
InBlock.gif
InBlock.gif        
void COM_Interface.Show(ref long hWndParent, ref U8Login.clsLogin Login, object mRepManage, object mRepSysInfo)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
throw new Exception("该方法未能实现!");
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedBlockEnd.gif    }
然后编译并利用Regasm注册(或在VS2005项目属性中直接勾选)。
      然后是编写存储过程了,这里我们可以通过sp_OACreate、sp_OADestroy创建和销毁对象,通过sp_OAMethod、sp_OAGetErrorInfo调用对象和捕捉错误,下面是我以前的发送邮件的一段代码:
None.gif CREATE   PROCEDURE  dbo.SendMail 
None.gif
@to   varchar ( 50 ),
None.gif
@subject   varchar ( 255 ),
None.gif
@body   varchar ( 500 )
None.gif
AS
None.gif
DECLARE   @object   int  
None.gif
DECLARE   @hr   int  
None.gif
DECLARE   @return   varchar ( 255
None.gif
DECLARE   @src   varchar ( 255 ),  @desc   varchar ( 255
None.gif
None.gif
--  创建对象实例。 
None.gif
EXEC   @hr   =  sp_OACreate  ' ExtendProcC.SendMails ' @object  OUT 
None.gif
IF   @hr   <>   0  
None.gif
BEGIN  
None.gif
EXEC  sp_OAGetErrorInfo  @object @src  OUT,  @desc  OUT 
None.gif
SELECT  hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = ' 111 '
None.gif
RETURN  
None.gif
END  
None.gif
--  调用对象方法。
None.gif
EXEC   @hr   =  sp_OAMethod  @object ' Send ' , @return  OUT, ' smtp.163.com ' , ' 123@163.com ' , ' 123 ' , ' 123@163.com ' , ' 某某 ' , @to , ' 1 ' , @SUBJECT , @body
None.gif
IF   @hr   <>   0  
None.gif
BEGIN  
None.gif
EXEC  sp_OAGetErrorInfo  @object @src  OUT,  @desc  OUT 
None.gif
SELECT  hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
None.gif
RETURN  
None.gif
END  
None.gif
-- PRINT @return 
None.gif

None.gif
--  销毁对象实例。 
None.gif
EXEC   @hr   =  sp_OADestroy  @object  
None.gif
IF   @hr   <>   0  
None.gif
BEGIN  
None.gif
EXEC  sp_OAGetErrorInfo  @object @src  OUT,  @desc  OUT 
None.gif
SELECT  hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc  
None.gif
RETURN  
None.gif
END
None.gif
GO
None.gif
扩展存储过程的DLL将会作为COM对象运行于SQLServer的地址空间,所以在实现类中最好只有方法,慎用全局字段。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值