这个问题不定什么时候出现,一旦服务器端,应用层报告‘超时已过期‘的对话框,整个系统全被挂起,在服务器端把对话框点掉,系统又正常了。我用的是ScktSrvr.exe做服务。请大家帮助啦!

解决方案 »

  1.   

    服务器端是不是有动态生成的adoconnection,如果有的话,改成静态的,keepconnection设为true。我以前遇到的超时已过期都是adoconnection连接失败弹出的,如使用静态的,程序一旦连接成功就不会出现这个弹出了。
      

  2.   

    应该说我还没有用到动态生成的adoconnection,而且keepconnection应该都缺省设为true(待会我全部查一遍,谢谢!),报告‘超时已过期’也是没有什么时间上的规律,有时是一天报告一次,有时三五天也没有报告,因为应用层是dll形式,也无法定位是哪里代码报错的。
      

  3.   

    但我用了如下的形式,
    Result:=TADOConnection(Owner.Components[i]);即共享调用以前连接曾经上的TADOConnection,请问  erhan ,不知道也会存在这样的问题?
      

  4.   

    不出这个错就只能try...except...end了,但是你要知道出错代码的大概位置。
    Result:=TADOConnection(Owner.Components[i]);,这句话没有影响。
      

  5.   

    adoconnection连接失败弹出的,是不是就是  ADOConn.Connected := True; 地方会弹出的?
    我真不知道还会有哪些语句会出现‘超时已过期’的错误提示框,请erhan 再详细说说。
    这个问题折磨我很长时间,试了很多办法,还是不定期弹出,一弹出,几十个用户同时都被挂住,点掉那个框又全都好了,真要命
      

  6.   

    超时已过期不光是在adoconn.connedted := True的时候出,adoquery.open,adoquery.execsql等时候都会出,而adoquery.open如果返回一个超大的结果集的时候出现的概率更高。
    当然网络的稳定也是非常重要的。如果你的确有超大结果集的查询,建议你使用“分页”查询,分成多次。另外,我以前写过一段代码,可以无限等待查询成功,你可以参考一下。
    procedure TMainForm.QueryExec(mTempQuery:TADOQuery);
    var
            mError: boolean;
    begin
            while 0=0 do
            begin
                    mError := False;
                    try
                            mTempQuery.ExecSQL;
                    except
                            mError := True;
                    end;
                    if mError then
                    begin
                            try
                                    mTempQuery.Connection.Connected := False;
                                    mTempQuery.Connection.Connected := True;
                            except
                            end;
                            Application.ProcessMessages;
                    end
                    else
                            break;
            end;
    end;如果有结果集返回,原程序为:
    adoquery1.open;//adoquery1.open等同于adoquery1.ExecSQL加上adoquery1.Active:=True;
    改为:
    ExecQuery(adoquery1);
    adoquery1.Active := True;如果无结果集返回,原程序为:
    adoquery1.ExecSQL;
    改为:
    ExecQuery(adoquery1);我在很多程序中都使用了这段函数,从未出现过“超时已过期”的提示错误。使用这个函数最好在程序开发完毕后统一替换,因为程序内部处理比较简单,如果adoquery1.sql.text本身就是一个语法错误的sql查询语句,会导致程序进入死循环。
      

  7.   

    这种情况是对于未抓获的异常..TAPPLICATION对象自己拦截处理弹出的对话框.只需要对Appplycation.OnException事件进行处理.
    拖一个TApplicationEvents控件是比较方便,然后处理它的OnException事件..在这个事件中可以什么事都不做..不过最好还是在里面把异常信息通过文件日志方式输出.
    这样既可以看到输出,又不会阻塞服务.
      

  8.   

    1、首先检查有没有设超时的时间。
    2、检查数据控件的参数。特别是clientdata的参数。
      

  9.   

    请问pdbird(老巢),clientdata的参数在哪里?我中间层用了TRemoteDataModule、TAdoDataSet和TDataSetProvider;客户端用了TClientDataSet,都没有clientdata的参数。莫非是TAdoDataSet的CommandTimeOut?确省为30S
      

  10.   

    另外,我用的是dll,TApplicationEvents放在每个TRemoteDataModule上,一个DLL可能有数个TRemoteDataModule的。我的DLL的.dpr代码如下:library TWDAssign;uses
      ComServ,
      W_DMAssign in 'W_DMAssign.pas' {Assign: TRemoteDataModule} {Assign: CoClass},
      .....
      .....;
    exports
      DllGetClassObject,
      DllCanUnloadNow,
      DllRegisterServer,
      DllUnregisterServer;{$R *.TLB}{$R *.RES}begin
    end.
    不知道在这里怎么写的?
      

  11.   

    三层dll里TApplicationEvents不知道该放在哪里?
      

  12.   

    如果是EXE型的,在启动FORM上面用一个TApplicationEvents就行了.如果是DLL型,那放TRemoteDataModule是可以的..因为TRemoteDataModule是远程调用时候才创建,
    得每个TRemoteDataModule上面放一个,呵呵.