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的地址空间,所以在实现类中最好只有方法,慎用全局字段。


  • 相关阅读:
    Docker常用基础命令详解
    Docker安装教程(超详细)
    IDEA 新建 Java 项目 (图文讲解, 良心教程)
    SpringBoot2.0之@Configuration注解
    idea的安装和无限期试用
    vue 取消上次请求
    calc()使用通用的数学运算规则,但是也提供更智能的功能:
    pdfh5 移动端 查看pdf
    Git处理Failed to connect to www.google.com port 80: Timed out
    对象排序
  • 原文地址:https://www.cnblogs.com/end/p/732365.html
Copyright © 2011-2022 走看看