在SQLSERVER中創建 OLE 對象實例,有時我們想到數據庫中執行存儲過程的時候,同時調用系統中的COM對象。此時我們可以采用SQL的系統存儲過程sp_OACreate ,此存儲過程的調用要有一定的權限,只有 sysadmin 固定服務器角色的成員才能執行 sp_OACreate。
	
	語法
	sp_OACreate progid, | clsid,
	    objecttoken OUTPUT
	    [ , context ]
	
	參數
	progid
	
	是要創建的 OLE 對象的程序標識符 (ProgID)。此字符串描述該 OLE 對象的類,其形式如下:
	
	'OLEComponent.Object'
	
	OLEComponent 是 OLE 自動化服務器的組件名稱,Object 是 OLE 對象名。指定的 OLE 對象必須有效并且必須支持 IDispatch 接口。
	
	例如,SQLDMO.SQLServer 是 SQL-DMO SQLServer 對象的 ProgID。SQL-DMO 的組件名稱為 SQLDMO,SQLServer 對象是有效的,并且同所有 SQL-DMO 對象一樣,SQLServer 對象支持 Idispatch。
	
	clsid
	
	是要創建的 OLE 對象的類標識符 (CLSID)。此字符串描述該 OLE 對象的類,其形式如下:
	
	'{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}'
	
	指定的 OLE 對象必須有效并且必須支持 IDispatch 接口。
	
	例如,{00026BA1-0000-0000-C000-000000000046} 是 SQL-DMO SQLServer 對象的 CLSID。
	
	objecttoken OUTPUT
	
	是返回的對象令牌,并且必須是數據類型為 int 的局部變量。該對象令牌用于標識所創建的 OLE 對象,并將在調用其它 OLE 自動化存儲過程時使用。
	
	context
	
	指定新創建的 OLE 對象要在其中運行的執行上下文。如果指定,那么此值必須為下列值之一:
	
	1 = 僅為進程內 (.dll) OLE 服務器
	4 = 僅為本地 (.exe) OLE 服務器
	5 = 進程內 OLE 服務器和本地 OLE 服務器均可
	
	如果未指定,其默認值為 5。此值將在調用 CoCreateInstance 時作為 dwClsContext 參數傳遞。
	
	若允許使用進程內 OLE 服務器(通過使用上下文值 1 或 5 或者不指定上下文值),該服務器將可以訪問 SQL Server 擁有的內存和其它資源。進程內 OLE 服務器可能會破壞 SQL Server 的內存或資源并導致不可預知的結果,如 SQL Server 訪問違規。
	
	當上下文值指定為 4 時,本地 OLE 服務器不能訪問任何 SQL Server 資源,因而不能破壞 SQL Server 的內存或資源。
	
	 
	
	說明  此存儲過程的參數按位置指定,而不是按名稱指定。
	
	
	返回代碼值
	0(成功)或非零數字(失?。怯?OLE 自動化對象返回的 HRESULT 的整數值。
	
	我們來看一下一個具體的示例,在此示例中我們將調用一個自己寫的COM組件,此組件的功能是提供讀寫序列號的功能。
	
	CREATE PROCEDURE [dbo].[sp_MyCheckSN]
	@ENCRYPTION nvarchar(255) out,@type int out
	  AS
	 DECLARE @object int
	DECLARE @hr int
	DECLARE @property varchar(255)
	DECLARE @return varchar(255)
	DECLARE @src varchar(255), @desc varchar(255)
	
	-- 創建一個COM對象
	EXEC @hr = sp_OACreate 'SecuritySN.CSecurity', @object OUT
	IF @hr <> 0
	BEGIN
	 set @ENCRYPTION='err'
	     RETURN
	END
	
	-- 調用方法
	declare @aa  nvarchar(255)  -- 最終返回的值
	EXEC @hr = sp_OAMethod @object, 'GetDiskSN', @aa out
	IF @hr <> 0
	BEGIN
	 set @ENCRYPTION='err'
	     RETURN
	END
	else
	begin
	 set  @Type=8 -- 指明注冊讀取方式
	end
	
	---------------------
	if @aa=''
	begin
	 -- 再讀一次
	 EXEC @hr = sp_OAMethod @object, 'GetSNByAPI', @aa out
	 if @hr<>0
	  begin
	   set @ENCRYPTION='err'
	       RETURN
	  end
	 else
	 begin
	  set @Type=5 -- 指明是哪種方式讀取注冊號的
	 end
	end
	
	-- 銷毀此對象
	EXEC @hr = sp_OADestroy @object
	IF @hr <> 0
	BEGIN
	  set @ENCRYPTION='err'
	     RETURN
	END
	set @ENCRYPTION=@aa
	GO
	
	
	為了防止用戶修改存儲過程的代碼。我們可以將此存儲過程進行加密處理。但是加密后的存儲過程也可能被破譯出來。
Copyright@ 2011-2016 版權所有:大連千億科技有限公司 遼ICP備11013762-3號 google網站地圖 百度網站地圖 網站地圖
公司地址:大連市沙河口區中山路692號辰熙星海國際2317 客服電話:0411-39943997 QQ:2088827823 37482752
法律聲明:未經許可,任何模仿本站模板、轉載本站內容等行為者,本站保留追究其法律責任的權利! 隱私權政策聲明