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程序並確定無誤後,我們就可以用上面提到的幾個相關係統存儲過程來調用了,下面請看實例,具體說明已包含在代碼中,不再重述。
@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組件,方法一樣簡單,不再詳述,如有興趣可與我探討。
後記
以上示例有參考網上廣爲流傳的一篇文章,不過那篇文章經轉來轉去,已被折磨得不成樣子了。