在SQL中调用COM对象

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

COM" target=_blank>SQLSERVER中创建OLE 对象实例,有时我们想到中执行存储过程的时候,同时调用系统中的 COM 对象。此时我们可以采用 COM" target=_blank>SQL的系统存储过程sp_OACreate,此存储过程的调用要有一定的权限,只有sysadmin固定服务器角色的成员才能执行sp_OACreate。

语法
sp_OACreateprogid,|clsid,
   objecttokenOUTPUT
   [,context]

参数
progid

是要创建的OLE 对象的程序标识符(ProgID)。此字符串描述该OLE 对象的类,其形式如下:

'OLE COMponent.Object'

OLE COMponent是OLE自动化服务器的组件名称,Object是OLE 对象名。指定的OLE 对象必须有效并且必须支持IDispatch接口。

例如, COM" target=_blank>SQLDMO. COM" target=_blank>SQLServer是 COM" target=_blank>SQL-DMO COM" target=_blank>SQLServer 对象的ProgID。 COM" target=_blank>SQL-DMO的组件名称为 COM" target=_blank>SQLDMO, COM" target=_blank>SQLServer 对象是有效的,并且同所有 COM" target=_blank>SQL-DMO 对象一样, COM" target=_blank>SQLServer 对象支持Idispatch。

clsid

是要创建的OLE 对象的类标识符(CLSID)。此字符串描述该OLE 对象的类,其形式如下:

'{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}'

指定的OLE 对象必须有效并且必须支持IDispatch接口。

例如,{00026BA1-0000-0000-C000-000000000046}是 COM" target=_blank>SQL-DMO COM" target=_blank>SQLServer 对象的CLSID。

objecttokenOUTPUT

是返回的 对象令牌,并且必须是数据类型为int的局部变量。该 对象令牌用于标识所创建的OLE 对象,并将在调用其它OLE自动化存储过程时使用。

context

指定新创建的OLE 对象要在其中运行的执行上下文。如果指定,那么此值必须为下列值之一:

1=仅为进程内(.dll)OLE服务器
4=仅为本地(.exe)OLE服务器
5=进程内OLE服务器和本地OLE服务器均可

如果未指定,其默认值为5。此值将在调用CoCreateInstance时作为dwClsContext参数传递。

若允许使用进程内OLE服务器(通过使用上下文值1或5或者不指定上下文值),该服务器将可以访问拥有的内存和其它资源。进程内OLE服务器可能会破坏 COM" target=_blank>SQLServer的内存或资源并导致不可预知的结果,如 COM" target=_blank>SQLServer访问违规。

当上下文值指定为4时,本地OLE服务器不能访问任何 COM" target=_blank>SQLServer资源,因而不能破坏 COM" target=_blank>SQLServer的内存或资源。

 

说明 此存储过程的参数按位置指定,而不是按名称指定。


返回代码值
0(成功)或非零数字(失败),是由OLE自动化 对象返回的HRESULT的整数值。

我们来看一下一个具体的示例,在此示例中我们将调用一个自己写的 COM组件,此组件的功能是提供读写序列号的功能。

CREATEPROCEDURE[dbo].[sp_MyCheckSN]
@ENCRYPTIONnvarchar(255)out,@typeintout
 AS
 DECLARE@objectint
DECLARE@hrint
DECLARE@propertyvarchar(255)
DECLARE@returnvarchar(255)
DECLARE@srcvarchar(255),@descvarchar(255)

--创建一个 COM 对象
EXEC@hr=sp_OACreate'SecuritySN.CSecurity',@objectOUT
IF@hr<>0
BEGIN
 set@ENCRYPTION='err'
    RETURN
END

--调用方法
declare@aa nvarchar(255) --最终返回的值
EXEC@hr=sp_OAMethod@object,'GetDiskSN',@aaout
IF@hr<>0
BEGIN
 set@ENCRYPTION='err'
    RETURN
END
else
begin
 set @Type=8--指明注册读取方式
end

---------------------
if@aa=''
begin
 --再读一次
 EXEC@hr=sp_OAMethod@object,'GetSNByAPI',@aaout
 if@hr<>0
  begin
   set@ENCRYPTION='err'
      RETURN
  end
 else
 begin
  set@Type=5--指明是哪种方式读取注册号的
 end
end

--销毁此 对象 1 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值