C#編寫擴充預存程序

來源:互聯網
上載者:User
      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 成員#region COM_Interface 成員

        void COM_Interface.Show(ref long hWndParent, ref U8Login.clsLogin Login, object mRepManage, object mRepSysInfo)
        {
            throw new Exception("該方法未能實現!");
        }

        #endregion
    }

然後編譯並利用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的地址空間,所以在實作類別中最好只有方法,慎用全域欄位。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.