在SQL中調用COM對象

來源:互聯網
上載者:User
對象
在SQLSERVER中建立 OLE 對象執行個體,有時我們想到資料庫中執行預存程序的時候,同時調用系統中的COM對象。此時我們可以採用SQL的系統預存程序sp_OACreate ,此預存程序的調用要有一定的許可權,只有 sysadmin 固定伺服器角色的成員才能執行 sp_OACreate。

文法
sp_OACreate progid, | clsid,
    objecttoken OUTPUT
    [ , context ]

參數
progid

是要建立的 OLE 對象的程式標識符 (ProgID)。此字串描述該 OLE 對象的類,其形式如下:

'OLEComponent.Object'

OLEComponent 是 OLE Automation 伺服程式的組件名稱,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 Automation 物件返回的 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


為了防止使用者修改預存程序的代碼。我們可以將此預存程序進行加密處理。但是加密後的預存程序也可能被破譯出來。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。