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