我用Delphi编写了一个组件,在ASP中调用也正常。后来需要增加一点数据库查询的功能,所以在project中增加了一个DataMudule,里面放了一个ADOConnection,一个ADOQuery,可是在ASP中一调用该DataMudule及其相关数据库读取的操作,页面就显示“灾难性故障”。请问这是怎么回事?

解决方案 »

  1.   

    编译通过没问题,就是在asp中调用出错。
      

  2.   

    解决了,发布成COM+组件就没有问题了。
      

  3.   

    代码贴出来,侃侃
    应该增加一个接口方法
    在其中动态调用DataModule
    我作过,可以的,给个例子:
    unit Eric;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
      ComObj, ActiveX, AspTlb, EricCom_TLB, StdVcl;type
      TEricDB = class(TASPObject, IEricDB)
      protected
        procedure OnEndPage; safecall;
        procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
        procedure Test; safecall;
      end;implementationuses ComServ,DataMod;procedure TEricDB.OnEndPage;
    begin
      inherited OnEndPage;
    end;procedure TEricDB.OnStartPage(const AScriptingContext: IUnknown);
    begin
      inherited OnStartPage(AScriptingContext);
    end;procedure TEricDB.Test;
    var ss:String;
       Dm:TDataModuleAsp;
    begin
      ss:=Request.Form.Item['Name'];
      Response.Write('Hello,'+ss+'!');
      Response.Write('<P>');
      try
        Dm:=TDataModuleAsp.Create(Nil);
        Response.Write(Dm.DataSetTableProducer1.Content);
      finally
        Dm.Free;
      end;
    end;initialization
      TAutoObjectFactory.Create(ComServer, TEricDB, Class_EricDB,
        ciMultiInstance, tmApartment);
    end.
      

  4.   

    因为ASP Object是COM模型,所以需要使用线程。
    两种方法可以选择:
    1)最佳方案,不要自动生成DataModule,因为它会被作为全局变量,你除非保证它是Thread-free,否则,最好不要自动生成。在你需要得方法中,动态生成,虽然消耗资源,但很安全。
    2)如果自动生成DataModule,将TDatabase得HandleShared属性设为True
      

  5.   

    不因该用DataModule ,要用Remote Data Module (远程数据模块)!!!!!!!
      

  6.   

    chechy(简简单单的活)兄不愧有这么多星星,楼主听他的没错.当然,如果你愿意麻烦一点用COM+或RDM来做成三层结构也是可以的.