我用delphi编写了一个webservices的程序,对外公开一个查询姓名的函数,在debug的情况都是正常的,但是把它编译成dll以后,在IIS下运行就出错,请各个大哥帮忙解决,谢谢。function Tqq.get_name(name:string):string;stdcall;
var query:Tadoquery;
begin
   try
   query:=nil;
   query:=Tadoquery.create(nil);
   query.Connection:=datamodal.ADOConnection1;
   with query do
     begin
         close;
         with sql do
           begin
               clear;
               add('select yhxm from userinfo where name='''+name+'''');
           end;
           open;
     end;
     result:=query.fieldbyname('yhmc').AsString;
     finally
     query.Free;
     end;
end;程序好象执行到query.Connection:=datamodal.ADOConnection1;的是就出错了 ,是不是过程中不能调用数据模块单元啊!! 

解决方案 »

  1.   

    在webservice中怎样才能让所有的函数,和过程都同过一数据库连接??
      

  2.   

    缺少了coInitliaze  activeX单元。
      

  3.   

    创建adoquery之前调用coInitliaze,初始化ado com对象
      

  4.   

    coInitliaze 此函数在哪个单元里,便宜通不过。
    不是知道是不是这个问题,提示不是说创建adoquery错误,而是一个TremotetableException的一个异常错误!!请指教,谢谢,问题解决了在加分。
      

  5.   

    我做了实验不是oInitliaze 这个问题,因为我在过程中创建一个Tadoconnenction连接就可以了,只不过这么程序的效率比较低,没次都要创建一个连接,我想用一个永久的连接不知道怎么实现,请各位大哥帮帮忙啊!
    function Tqq.get_name(name:string):string;stdcall;
    var query:Tadoquery;
    var conn:Tadoconnection;
    begin
       try
       query:=nil;
       query:=Tadoquery.create(nil);
       conn:=Tadoconnection.create(nil);
       conn.connstring:='...';
       conn.opne;
       query.connection;=conn;
       query.Connection:=datamodal.ADOConnection1;
       with query do
         begin
             close;
             with sql do
               begin
                   clear;
                   add('select yhxm from userinfo where name='''+name+'''');
               end;
               open;
         end;
         result:=query.fieldbyname('yhmc').AsString;
         finally
         query.Free;
         end;
    end;
      程序在过程中加了一个数据库连接就可以了,我想应该不是coInitliaze函数的问题!!
      

  6.   

    因为Tadoconnenction实际是ADO的封装,它只能在创建它的线程里面直接使用。
    要在同一进程其它线程共享它,则必须marshall接口或使用全局接口表(GIT)方式,可以参考一些相关贴子。
    http://expert.csdn.net/Expert/topic/2516/2516319.xml?temp=.7895319http://expert.csdn.net/Expert/topic/2627/2627962.xml?temp=.7618982
      

  7.   

    to 哈欠 
      我加了那个初始化函数coInitliaze也没用啊!,还是会出错啊!一样的错!
      

  8.   

    最开始本来以为你的问题是缺少CoInitliaze,不过看你那儿情况其实是调用这个DLL的函数里
    面已经用了它,你就不用再调用它。TAdoConnection这些ADO组件都是ADO COM组件的封装,比较简单做法就是每次使用就动态
    创建然后动态释放,这样做效率未必一定低的,因为创建一次连接对象并不意味处理一次数
    据库连接动作。当然,共享ADO连接在有些情况在能够得到一定的效率提高。。
    不要盲目去做优化。