zoukankan      html  css  js  c++  java
  • 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) 

     示例程序下载  

  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/1781025.html
Copyright © 2011-2022 走看看