我用delphi的ado方式连接局域网内另一台服务器上的sqlserver,如果网络发生很短暂的中断出现也会出现“连接失败”提示,必须重新启动程序,才能正常连接。想请教高手,有什么办法解决? 

解决方案 »

  1.   

    1、加一个timer控件,时时检查SQL是否正常连接,如果非人为断开立即连接;
    2、捕捉该异常,然后连接SQL服务器
      

  2.   

    我是用的几个adoquery共用一个ADOConnection
      

  3.   


    //数据模块单元代码:
    procedure TDataModule1.DataModuleCreate(Sender:TObject);
    begin
      with mainform.ConDB do //condb为主窗体mainform里面的一个panel控件
      begin
        Visible:=true;//显示连接数据库提示信息
        left:=(mainform.width-6)div 2-width div 2;
      end;
      mainform.Refresh;
      OpenLink;
    end;procedure TDataModule1.OpenLink;
    var
      ini:Tinifile;
      s,DSource:string;
    begin
       Timer.Enabled:=false;//timer时钟控件
       mainform.ConDB.Caption:='正在连接数据库,请稍等……';
       mainform.ConDB.Show; //显示提示信息
       //读取ini文件里面的数据源信息,具体情况可以自己修改
       ini:=Tinifile.Create(extractfilepath(paramstr(0))+'DataConnect.ini');
       try
         DSource:=ini.ReadString('DataBase','Server','qzdb');
       finally
         ini.Free;
       end;
       s:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=qzled;Data Source=.';
       s:=s+';Data Source='+DSource;   try
         ADOConnection1.Close;
         ADOConnection1.ConnectionString:=s;
         ADOConnection1.Open;     mainform.ConDB.Visible:=false;//隐藏连接数据图提示
         //数据库连接成功后,这里可以进行你要想做的操作
         {......}
       except
         Tag:=Tag+1;
         mainform.ConDB.Caption:='[ '+inttostr(Tag)+'次 ]连接数据库失败!10秒后重试';
         Timer.Interval:=10000;
         Timer.Enabled:=true;
       end; 
    end;
    ......
    //MainForm中,如果数据库连接失败,调用ReConDB函数重新连接数据库
    //注意使用异常处理中来判断数据库连接是否正常
    //try
    //{...数据库操作(查询、读、写、删...)...}
    //except
    //  ReConDB;
    //end;
    procedure TMainform.ReConDB;
    begin
      DataModule1.ADOConnection1.Connected:=false;
      DataModule1.Timer.Tag:=0;
      DataModule1.Timer.Interval:=3000;
      DataModule1.Timer.Enabled:=true;
    end;
    有什么问题可以给我留言......
      

  4.   

    在ADOConnection1BeforeDisconnect或ADOConnection1AfterDisconnect事件中重连
      

  5.   

    用TIMER不是很好吧,不如加个线程,判断是否在用,在用则刷新,没在用则重连
      

  6.   


    不用重新启动程序的吧?关闭adoconnection再重新open,就可以的了
      

  7.   

    也可以采取如下方式procedure TdtmData.AppErrorException(Sender: TObject; E: Exception);
    var temp:string;
    begin
      if (PosEx('DBNETLIB',E.Message)>0) OR (PosEx(Prompt_Net,E.Message)>0) then
      begin
        //断线重连
      end
      else
        MessageDLG(E.Message,mtWarning,[mbok],0);}
    end;
      

  8.   

    ADOConnection.OnInfoMessage事件中处理一下。
      

  9.   

    1、对于目前两层的应用来说,ADOConnection连接的异常是没有办法捉到的,只能像上面所说的那样,加一个timer控件,定时去调用一个线程,检查SQL是否正常连接,可以每隔20秒查一次。。用一个adoquery,语句可以参考如下:
        try
          sp_main_frm.ADOQuery1.Close;
          sp_main_frm.ADOQuery1.SQL.Clear;
          sp_main_frm.ADOQuery1.SQL.Add('select 1');
          sp_main_frm.ADOQuery1.Open;
        except
          try
            sp_main_frm.Timer2.Enabled:=false;        sp_main_frm.ADOConnection2.Connected:=false;
            sp_main_frm.ADOConnection2.Connected:=true;
          except
          end;
        end;