我现在正在做一个程序是个实时监控的,采集的数据实时写入SQL库。SQL服务器在公司服务器上,网内的其它电脑看到的数据是服务器上的。如果网络是正常的没有任何问题,但是如果网络不通时程序就找不到数据库而出错!!请问有什么办法来监视 SQL 是否正常连接,让我的程序不出错???!!

解决方案 »

  1.   

    TO: must0001(飞鸟) 你是让查看ADOConnection.Connected么?我这样做了,但不成功。如果你这样做成功能把你的办法告诉我么??
      

  2.   

    首次连接正常后,用以下函数随时判断:
    function TDataModuleMain.NetConnect: Boolean;
    begin
      Try
        ADODataSetCheckNet.Close;
        ADODataSetCheckNet.CommandText:='Select GetDate() as CurrentDateTime';
        ADODataSetCheckNet.Open;
        CurrentDateTime:=ADODataSetCheckNet.FieldByName('CurrentDateTime').AsDateTime;
        Result:=True;
      Except
        ShowMessage('数据连接中断,请迅速与系统管理员联系!');
        Result:=False;
      end;
    end;
      

  3.   

    if ADOConnection.Connected = False then
       ADOConnection.Connected := True;
      

  4.   

    楼上的方法不对,在正常连接之后,就是把网线拔了,系统已经提示连接不上数据库了,adoconnection.connected还是true,我正在为这个问题发愁,就是找不到解决的办法
      

  5.   

    变通解决办法:
    procedure Tmainform.Timer2Timer(Sender: TObject);
    begin
           try
                  adoconnection1.execut('select 1');
           except
                  adoconnection1.close;
                  adoconnection1.keepconnection:=false;
                  adoconnection1.open;
                  adoconnection1.keepconnection:=true;
           end;
    end;
      

  6.   

    楼上的思路是对的,但不全面。如果已经断了,虽然服务器启动了、网络也通了,但还是提示无法连接。有一个函数可以检测SQLserver的状态,明天告诉你,我要下班了。
      

  7.   

    我也是从别的地方学来的,就是SQLServer中自带的w95scm.dll动态链接库,其接口函数是 function SQLSCMGetLocalServiceStateA(lpszSvc: PChar;dwErr:PDWORD): Integer;cdecl;设计步骤是这样的:在Internet面板中中添加一TClientSocket控件,在其中设置好address、端口(一般是1433,就是SQLserver服务器配置中的端口号),添加Timer控件,
     object cs: TClientSocket  
        Active = False  
        Address = '202.99.0.172'  
        ClientType = ctNonBlocking  
        Port = 1433  
        Left = 32  
        Top = 48  
      end  
      object Timer1: TTimer  
        Interval = 5000  
        OnTimer = Timer1Timer  
        Left = 80  
        Top = 48  
      end  
    end  
    ////////////代码  
    unit Unit1;  interface  uses  
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
      StdCtrls, ScktComp, ExtCtrls;  const  
      SERVICE_STOPPED=1; // Stopped  
      SERVICE_START_PENDING=2; // Starting  
      SERVICE_STOP_PENDING=3; // Stopping  
      SERVICE_RUNNING=4; // Running  
      SERVICE_CONTINUE_PENDING=5; // Restarting after being paused  
      SERVICE_PAUSE_PENDING=6; // Pausing  
      SERVICE_PAUSED=7; //Paused  type  
      TForm1 = class(TForm)  
        cs: TClientSocket;  
        Button1: TButton;  
        Timer1: TTimer;  
        procedure Timer1Timer(Sender: TObject);  
      private  
        { Private declarations }  
      public  
        { Public declarations }  
      end;  
      function SQLSCMGetLocalServiceStateA(lpszSvc: PChar;dwErr:PDWORD): Integer;cdecl;external 'w95scm.dll';  var  
      Form1: TForm1;  implementation  {$R *.DFM}  
    procedure TForm1.Timer1Timer(Sender: TObject);  
    var
      r,e: DWORD;  
    begin  
      r := SQLSCMGetLocalServiceStateA('MSSQLServer',@e);  
      case r of  
        SERVICE_STOPPED:  
          ShowMessage('Stoped');  
        SERVICE_START_PENDING:  
          ShowMessage('Starting');  
        SERVICE_STOP_PENDING:  
          ShowMessage('Stopping');  
        SERVICE_RUNNING:  
          ShowMessage('Running');  
        SERVICE_CONTINUE_PENDING:  
          ShowMessage('Restarting');  
        SERVICE_PAUSE_PENDING:  
          ShowMessage('Pausing');  
        SERVICE_PAUSED:  
          ShowMessage('Paused');  
      end;  
    end;  
      

  8.   

    补充说明:按这样做了后,发现系统支行很慢,调整SQLServer服务器的状态要等上很长时间,我也在研究中。因为 这两天有事,没有及时回复,请包涵!
    jianjunhisa@126.com
      

  9.   

    chenylin(陈SIR)的函数,是不是要用在Timer事件里呢?
      

  10.   

    pdcdiy163(代码写的好、要饭要到老)
    同意chenylin(陈SIR) ( ) 信誉:100 的方法
    下面写大串代码的人,并不是写得多就一定是你的方法
    ----------------------------------
    敢问:pdcdiy163
    你知道chenylin(陈SIR)写的代码里边
        ADODataSetCheckNet.Close;
        ADODataSetCheckNet.CommandText:='Select GetDate() as CurrentDateTime';
        ADODataSetCheckNet.Open;
    这些是什么来的么?
      

  11.   

    try
                  adoconnection1.execut('select 1');
    这个方法怎么会不行?
    结了吧这个贴子