zoukankan      html  css  js  c++  java
  • C#编写扩展存储过程

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

        }


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

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


            
    COM_Interface 成员
        }
    然后编译并利用Regasm注册(或在VS2005项目属性中直接勾选)。
          然后是编写存储过程了,这里我们可以通过sp_OACreate、sp_OADestroy创建和销毁对象,通过sp_OAMethod、sp_OAGetErrorInfo调用对象和捕捉错误,下面是我以前的发送邮件的一段代码:
    CREATE PROCEDURE dbo.SendMail 
    @to varchar(50),
    @subject varchar(255),
    @body varchar(500)
    AS
    DECLARE @object int 
    DECLARE @hr int 
    DECLARE @return varchar(255
    DECLARE @src varchar(255), @desc varchar(255

    -- 创建对象实例。 
    EXEC @hr = sp_OACreate 'ExtendProcC.SendMails'@object OUT 
    IF @hr <> 0 
    BEGIN 
    EXEC sp_OAGetErrorInfo @object@src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), Source=@src, Description='111'
    RETURN 
    END 
    -- 调用对象方法。
    EXEC @hr = sp_OAMethod @object'Send',@return OUT,'smtp.163.com','123@163.com','123','123@163.com','某某',@to,'1',@SUBJECT,@body
    IF @hr <> 0 
    BEGIN 
    EXEC sp_OAGetErrorInfo @object@src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
    RETURN 
    END 
    --PRINT @return 

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


  • 相关阅读:
    DDL、DML和DCL的区别与理解
    oracle中游标详细用法
    委托与事件
    c#中的引用类型和值类型
    DevExpress控件给数据列表中特殊行数据设置颜色
    windows下redis的安装
    python操作数据库
    python操作excel
    iMessage, Facetime 解决办法
    iOS 静态库,动态库与 Framework
  • 原文地址:https://www.cnblogs.com/end/p/732365.html
Copyright © 2011-2022 走看看