在SQLServer中調用Com組件

 有時候,出於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組件,方法一樣簡單,不再詳述,如有興趣可與我探討。 
 
後記
        以上示例有參考網上廣爲流傳的一篇文章,不過那篇文章經轉來轉去,已被折磨得不成樣子了。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章