现在是这样的,如果是连接数据库的话,我一般这样写
with adoquery do
begin
  ......
  try
    Open;
  except
    ShowMessage('出错了');
  end;
end;
这样的话,如果数据库没启动或是什么的,界面会像死了
一样,直到弹出我的对话框,
有没有什么办法快一点呢?
或是在OPEN前先看一下数据是否是启动了,或是网络是否连接

解决方案 »

  1.   

    把数据库连接组件的 connectimer (就是yang时设的短一点, 属性名字你看看,我记不清了) 值设变小
      

  2.   

    如没有启动sql,检测是需要很久的,你打开企业管理器它也要那么长的时间
      

  3.   

    用TClientSocket 探测端口是否打开
      

  4.   

    说SQL没有启动,只是打个比方,
    指所有OPEN不成功的情况,比如网络不通等等commandtimeout好像默认是30秒,改成1秒还是一样
      

  5.   

    但是如果没次连接前都用
    用TClientSocket 探测端口是否打开
    是不是又太麻烦呢?有没有好的方法呢?
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, winsvc, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    //start mssql server
     var
      lpServiceArgVectors:Pchar;
      hscmanager,hService:SC_HANDLE;
      returnstatus:TServiceStatus;
      html:string;
      exeresult:boolean;
    begin
      lpServiceArgVectors:=nil;
      hscmanager:=OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE);// 打开service control manager database
      hService:=OpenService(hscmanager,'MSSQLSERVER',SERVICE_ALL_ACCESS);
    //打开该Service
         if(hService<0) then
           begin
            html:='无法打开该Service';
             showmessage(html);
            exit;
           end;
            QueryServiceStatus(hService,returnstatus); //查看该Service的状态
         if returnstatus.dwCurrentState=SERVICE_STOPPED  then //如果该Service已停止则启动它
           begin
            html:=html+'正在启动SQL SERVER数据库...';
             showmessage(html);
            StartService(hService,0,lpServiceArgVectors);
            html:=html+'启动成功.';
             showmessage(html);
           end
         else
           html:=html+'无法打开SQL SERVER'+inttostr(returnstatus.dwServiceType);
         CloseServiceHandle(hService);//关闭该Service
        showmessage(html);
    end;end.
      

  7.   

    上面的代码只是直接判断sql是否启动了没有,我以前做的。本地使用。如果用在c/s上得自己改改.
    你的软件可以做成先出界面,然后在连sql呀,如果不成功可以在先出的界面上做提示。让用户知道不是死了或别的。
      

  8.   

    楼上几位老大都是高手,小弟是这样做的:            adoconnection.cnnected:=false;
                 adoconnection.connectstring:='........master...
               try
                 adoconnection.connected:=true;
               finally
                   begin
                      showmessage('数据库连接失败');
                      application.terminate;
                    end;
                end;
    end;
    就是建一个连接到master数据库,能连上就ok.小弟技艺尚,请楼下高手指点
      

  9.   

    楼上几位老大都是高手,小弟是这样做的:            adoconnection.cnnected:=false;
                 adoconnection.connectstring:='........master...
               try
                 adoconnection.connected:=true;
               finally
                   begin
                      showmessage('数据库连接失败');
                      application.terminate;
                    end;
                end;
    end;
    就是建一个连接到master数据库,能连上就ok.小弟技艺尚,请楼下高手指点
    -----------------------------------------------------------------
    我也是用chinaandys(天煞孤星&&蛋炒饭)的这种方法。
      

  10.   

    1.如果是本地的sql server,建议直接查看服务状态,几乎不需要时间;
    2.远程sql server貌似只能老老实实连了,不过建议连之前先ping一下(如果对方网管没屏蔽的话) ,免得碰上网络故障的情况白白等timeout。
    3. 不是所有的sql server实例都是用tcp/ip协议通讯的,很有可能碰上named pipe通讯的,此时socket不管用的。
      

  11.   

    就算能Ping通,也只是表明能和對方機器連接,如果對方的Sql server服務沒打開,也是連不上數據庫的
      

  12.   

    if not adoconnection.connected then
      
         adoconnection.open
      

  13.   

    to: wxmijl(心灵之窗) 
    ping一下起码能排除网络故障,而且ping的速度比connection测试要快n倍。