• SQL Server 存储过程/触发器中调用COM组件的方法


    实施别的系统时遇到一个问题,就是在SQL Server中中使用新建服务器连接方式连接到数据库Oracle时查询和写入某个表时出错,后来想到用一个外挂的程序来操作,可需要触发条件,轮询的话涉及到及时性和网络负荷问题.到网上一搜索,发现可以在SQL Server的存储过程或触发器中调用COM组件,这就比较好解决了.

    首先建立一个COM服务器,只在里面写一个测试方法:Hello:

    1 function TCotest.Hello(const Value: WideString): WideString;
    2 begin
    3   Result:='您输入的是:'+Value;
    4 end;

     可以在IDE中注册这个服务器,或者在初始化代码后加入自动注册的代码:

    1 initialization
    2   TComponentFactory.Create(ComServer, TCotest,
    3     Class_Cotest, ciMultiInstance, tmApartment);
    4   ComServer.UpdateRegistry(true);
    5 end.

     从D2007开始需要手工加入:

    ComServer.UpdateRegistry(true);

    否则COM服务器不能自动注册(当然可以手工注册) .

    好了,可以先写个客户端测试一下,放个TDCOMConnection组件,设定好服务器的名称,OK,可以正常激活这个COM组件.

    用代码来调用测试一下吧:

    1 var
    2   v:Variant;
    3   s:string;
    4 begin
    5   v:=CreateOleObject('Project4.Cotest');
    6   s:=v.Hello('Garfield');
    7   ShowMessage(s);
    8   v := Unassigned;
    9 end;

    注意:要引用ComObj单元.

    程序可以正常执行并返回结果,说明COM组件运行正常.

    好了,让我们来到关键的SQL Server中,可以在查询分析器中或建立一个储存过程来测试一下调用:

    (注:参考了网络上的代码) 

     1   declare @i int
     2   declare @strRet varchar(50)
     3   declare @strRetCode int
     4   DECLARE @strErr varchar (255)
     5   DECLARE @strErr1 varchar (255)
     6   /* 首先创建Com 实例 */
     7   exec @strRetCode = sp_OACreate "Project4.Cotest", @i out
     8   IF @strRetCode <> 0
     9   BEGIN
    10   /* 创建实例 失败 */
    11   EXEC sp_OAGetErrorInfo @i@strErr OUT, @strErr1 OUT
    12   PRINT '创建实例失败,失败的原因是:' + @strErr + '' + @strErr1
    13   RETURN
    14   END
    15   /* 创建成功,开始调用 */
    16   EXEC @strRetCode = sp_OAMethod @i,'Hello',@strRet OUT,'Garfield'
    17   IF @strRetCode <> 0
    18   BEGIN
    19   /* 调用方法出错 */
    20   EXEC sp_OAGetErrorInfo @i@strErr OUT, @strErr1 OUT
    21   PRINT '调用方法失败,失败的原因是::' + @strErr + @strErr1
    22   EXEC sp_OADestroy @i
    23   RETURN
    24   END
    25   PRINT '返回的结果是:' + @strRet
    26   exec sp_OADestroy @i 

      

     注意,只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate

    执行一下,看到COM组件成功地在储存过程中返回了结果.

    (测试环境:Win7+Delphi2010+SQL Server 2000) 

     示例程序下载  

  • 相关阅读:
    1254:走出迷宫
    1332:【例2-1】周末舞会
    P1744 采购特价商品 题解(讲解图论)
    p1305 新二叉树
    P1069 细胞分裂
    LOJ #124. 除数函数求和 1
    P4438 [HNOI/AHOI2018]道路
    P4318 完全平方数
    P1447 [NOI2010]能量采集
    P3200 [HNOI2009]有趣的数列
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/1781025.html
Copyright © 2020-2023  润新知