多层系统中 多个人同时操作同一个数据表时,中间层就死机了。
如何解决:用的是TSocketConnection  连接

解决方案 »

  1.   

    to: huiwww(十足菜鸟) ( )
      你写过三层程序吗???
      

  2.   

    本人在做三层结构时, 不知怎么用这个TSocketConnection 
    如有哪位高手能指点一点,本人很是感谢
      

  3.   

    把应用服务器的的数据设置成无状态,详见李维《Delphi 5.X ADO_MTS_COM+高级程序设计篇》
      

  4.   

    给大家一段程序大家看看。
    //17****************************************************************************
    //根据水表号检索当前水表计费信息
    //参数:SBH水表编号
    //返回参数:返回查找的记录数
    //******************************************************************************
    function TGSRD.Get_sbjfxx(const SBH: WideString;
      var re: WideString): Integer;
    begin
       with DataModule1 do
       begin
       try
        ads_sfwsfdj.Close;
        ads_sfwsfdj.CommandText:='';
        ads_sfwsfdj.CommandText:='select * from meter where watergage_code=:sbh ';
        ads_sfwsfdj.Parameters.ParamByName('sbh').Value:=sbh;
        ads_sfwsfdj.Open;
        result:=ads_sfwsfdj.RecordCount;
        re:='^1^';
       except
       on E: Exception do
          begin
           frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message);
           re:= '方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message;
           exit;
          end;
       end;
       frm_main.add_message(' 方法调用成功. 方法名称:Get_sbjfxx, '+'  根据水表号检索当前水表计费信息调用成功!');
       end;
    end;
    请看看多人使用时候会有问题吗????
      

  5.   

    现将错误信息公布如下:
     1\ operation cannot be performed while execnting asyncharononsly.
     2\ 2004-8-26 12:17:10:   方法调用失败.方法名称:Get_khJTSBxx; 错误内容: Connection is busy with results for another command
      

  6.   

    问题在数据库上的。。
    这个错误信息很常见的。
    两点改动意见:
    1,    最好改这句改成记日志文件。。
    frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message);
    2,  抓住异常后要AdoConnection.close;
      

  7.   

    1;
    frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message);
    已经改动了。
    问: halfdream(哈欠) ( ) “ 抓住异常后要AdoConnection.close;”
    为何要这样做,AdoConnection.close后,需要OPEN吗??;
      

  8.   

    frm_main.Add_ERRmessage是怎样的?你的程序可能是这里死掉了
      

  9.   

    procedure Tfrm_main.add_message(msg:string);
    begin
    // errmemo_message.Lines.Add(datetimetostr(now())+':  '+msg);
    end;
    procedure Tfrm_main.add_ERRmessage(msg:string);
    begin
    errmemo_message.Lines.Add(datetimetostr(now())+':  '+msg);
    end;注释:
    errmemo_message:Tmemo
    end;
      

  10.   

    最新错误信息公布如下:
     1\ item cannot be found in the collection corresponding to the requesed name or ordinal
     2\ cannot peform this operation on an open dataset.
      

  11.   

    线程模式:  TComponentFactory.Create(ComServer, TGSRD,
        Class_GSRD, ciMultiInstance, tmApartment);
      

  12.   

    很可能是你的中间层的数据集是打开的。把中间层数据集的Active属性设置成False
      

  13.   

    应该就是在
    procedure Tfrm_main.add_ERRmessage(msg:string);
    begin
    errmemo_message.Lines.Add(datetimetostr(now())+':  '+msg);
    end;
    这里死掉了,多项程不要直接调用涉及GUI控件的方法,即使你用临界保护也没用,何况你这里连保护都没有建议用消息或者同步方法来实现
      

  14.   

    to : alphax(多喝了三五杯) ( ) 
    那一段我已经删除了,(add_ERRmessage(msg:string);)
    然后出现:2\ cannot peform this operation on an open dataset.
    我想是:多用户调用中间层时候,互相影响了,如何做到互相不影响。为每个客户端单独创建一个Apartment。
     谢谢
      

  15.   

    DataModule1是每个客户对象各自一个还是共享?如果是共享的话,很可能就是没有同步好的原因
      

  16.   

    在中间层使用Session就不会互相影响了,还有我刚才说的,你看看你中间层的数据集是不是打开了,不要打开中介层的数据集
      

  17.   

    谢谢  happy1123(飞天神鼠) 的回答。
    中间层的数据集都是CLOSE的。通过程序OPEN 。如果两人同时调用方法OPEN。就会出现如上错误。另:如何使用中间层  session .好象是 BDE的产物。我用的是AOD。李微的书也提到。
      

  18.   


    to alphax(多喝了三五杯) ( ) :
    "DataModule1是每个客户对象各自一个还是共享?
    我该如何看DataModule1是每个客户对象各自一个还是共享,我不会看。
      

  19.   

    >>我该如何看DataModule1是每个客户对象各自一个还是共享,我不会看。
    就是当你每创建一个COM对象时,是否同时创建了一个属于该COM对象私用的DataModule1,不过从你的使用的标识符的命名上看来,你很可能是多个对象实例操作同一个DataModule1对象,幸好还是ADODataSet对象,要是别的TDataSet对象,你哪能看到这么友好的错误信息,中间层不崩溃给你看才怪呢如果你想多个COM对象同时存取一个全局的dataModule对象,那就必须同步好,要做好临界保护,还要求每个调用都是没有上下文的调用,,,如果你是初学的,最好是每创建一个COM对象就创建一个DataModule对象
      

  20.   

    To: alphax(多喝了三五杯) 
      我知道我错在那里了,也明白了“共享”和“单独”的DataModule1的问题了。谢谢,
    你是真正的多层高手。希望将来能多多赐教。com/dcom的多线程的,如果中间加入了单个窗口上的方法操作,肯定会出问题。整个的服务器都应是多线程的。