C#编写扩展存储过程

本文介绍如何使用 .NET 编写 DLL 并将其注册为 COM 对象,以实现 SQL Server 的扩展存储过程功能。文章详细展示了从创建类库到实现 COM 接口的方法,以及如何在 SQL Server 中调用这些扩展存储过程。
      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.gifCREATE 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、付费专栏及课程。

余额充值