在Sql Server的預存程序中調用Com組件 【轉載】

來源:互聯網
上載者:User
在Sql Server的預存程序中調用Com組件

http://www.cnblogs.com/bonny.wong/archive/2005/03/29/127373.html
        有時候,出於SQL Server本身的功能不足,我們需要用外部的程式來實現,而Com由於其語言的無關性和強大的功能就成為與Sql Server介面的首選,並且sql Server本身也提供了這方面的系統預存程序用以實現與com的介面。這幾個相關的系統預存程序為: 

        sp_OACreate 在 Microsoft SQL Server 執行個體建立 OLE 對象的執行個體。 

        sp_OAMethod 呼叫 OLE 對象的方法 

        sp_OAGetProperty 取得 OLE 對象的屬性值 

        sp_OASetProperty 將 OLE 對象屬性設定為新值。 

        sp_OAGetErrorInfo 獲得 OLE Automation 錯誤資訊 

        sp_OAStop 停止整個伺服器 OLE Automation 預存程式執行環境。 

        sp_OADestroy 銷毀建立的 OLE 對象。


        知道了實現的可能性,那麼到底該如何?呢?下面請跟我來:

一、 其它程式設計語言建立Com程式(以Delphi為例) 

        1、 關閉所有項目,建立一個工程,將預設的單元檔案unit1.pas儲存為uMain.pas,將預設的工程檔案project1儲存為ptestCom。當然你也可以儲存為你想要的檔案名稱,但要記住這裡設定的工程名就是後面需調用的com名稱; 

        2、 點擊菜單File->New->Other…,開啟建立項目視窗,選擇ActiveX頁,在其中找到Automation Object(因為sql server中要求被它調用的OLE Automation Server須支援Idispatch介面,所以選擇它),然後點OK,在彈出的響導框中輸入Class Name(這裡輸入testObject),其它保持不變,按OK完成; 

        3、 在以上步驟完成後,就會彈出一個名叫testCom的類型庫視窗,在視窗的左側我們就會看到上面所建立的類testObject和一個叫ItestObject的介面類,選中ItestObject,點擊工具列上的New Method建立一個新的方法,命名為testfunc,然後在右邊的parameters頁上添加兩個輸入參數param1和param2(Type為BSTR,Modifier為[in])、一個輸出參數paramout(Type為Variant *,Modifier為[out, retval]),Return type保持不變,為Hresult。點一下工具列上的重新整理按鈕,按儲存,將它儲存為utestcom.pas和utestcom.tlb,然後關閉視窗; 

        4、 此時,在utestcom單元檔案中你將會看到已經產生了一個函數: 

        function TtestObject.testfunc(const param1,param2: Widestring): OLEVariant; 

        begin 

        end; 

        在其中加上如下代碼(當然你可以在此函數中使用你自己的方法來實現): 

                Result := Param1 + Param2; //將傳入兩個字串相加,然後返回 

        按儲存,運行它,確認無誤即可,如果有誤,請檢查以上步驟是否正確完成。

二、在SQL Server中的調用

        當建立好了Com程式並確定無誤後,我們就可以用上面提到的幾個相關係統預存程序來調用了,下面請看執行個體,具體說明已包含在代碼中,不再重述。

create procedure Check_UserAthor        --定義一個預存程序,接受兩個參數

 @c_id varchar(20),

 @c_name varchar(20)

As

DECLARE @object int

Declare @Err int

Declare @return_value varchar(255)

Declare @src varchar(255), @desc varchar(255)


/**//*創建Com實例,調用如上建立的ptestcom.testobject*/

exec @err = master..sp_OACreate "ptestcom.testobject", @object out

IF @err <> 0     /**//* 創建失敗*/

BEGIN

    

    EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT 

    SELECT hr=convert(varbinary(4),@err), Source=@src, Description=@desc

        RETURN

END


/**//*調用如上聲明的Com方法testfunc,@return_value為傳回值,@c_id與@c_name為輸入參數*/

EXEC @err = sp_OAMethod @object,'testfunc',@return_value OUT,@c_id,@c_name

IF @err <> 0

BEGIN

    EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT 

    SELECT hr=convert(varbinary(4),@err), Source=@src, Description=@desc

    EXEC sp_OADestroy @object

    RETURN

END


PRINT '返回結果為:' +(@return_value)     --這裡顯示傳回值


/**//*釋放Com實例*/

exec sp_OADestroy @object


GO


三、調用

        如上預存程序建立無誤後,我們就可以直接拿來調用了,在如上的樣本中,如果我們輸入'123','company',返回的結果就應該是123company這個字串了。

四、推論

        以上的com程式其實適合於任何能與com進行通訊的其它程式調用,比如在ASP中,也可以直接調用com組件,方法一樣簡單,不再詳述,如有興趣可與我探討。 

 

後記

        以上樣本有參考網上廣為流傳的一篇文章,不過那篇文章經轉來轉去,已被折磨得不成樣子了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.