在SQL中调用COM对象

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </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对象的类,其形式如下:

'OLECOMponent.Object'

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

例如,COM" target=_blank>SQLDMO.COM" target=_blank>SQLServer是COM" target=_blank>SQL-DMOCOM" 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-DMOCOM" 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"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
个人分类: 数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭