有時候,出於SQL Server本身的功能不足,我們需要用外部的程式來實現,而Com由於其語言的無關性和強大的功能就成為與Sql Server介面的首選,並且sql Server本身也提供了這方面的系統預存程序用以實現與com的介面。這幾個相關的系統預存程序為: sp_OACreate 在 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組件,方法一樣簡單,不再詳述,如有興趣可與我探討。 後記 以上樣本有參考網上廣為流傳的一篇文章,不過那篇文章經轉來轉去,已被折磨得不成樣子了。 |