现在是这样的,如果是连接数据库的话,我一般这样写
with adoquery do
begin
......
try
Open;
except
ShowMessage('出错了');
end;
end;
这样的话,如果数据库没启动或是什么的,界面会像死了
一样,直到弹出我的对话框,
有没有什么办法快一点呢?
或是在OPEN前先看一下数据是否是启动了,或是网络是否连接
with adoquery do
begin
......
try
Open;
except
ShowMessage('出错了');
end;
end;
这样的话,如果数据库没启动或是什么的,界面会像死了
一样,直到弹出我的对话框,
有没有什么办法快一点呢?
或是在OPEN前先看一下数据是否是启动了,或是网络是否连接
指所有OPEN不成功的情况,比如网络不通等等commandtimeout好像默认是30秒,改成1秒还是一样
用TClientSocket 探测端口是否打开
是不是又太麻烦呢?有没有好的方法呢?
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.
你的软件可以做成先出界面,然后在连sql呀,如果不成功可以在先出的界面上做提示。让用户知道不是死了或别的。
adoconnection.connectstring:='........master...
try
adoconnection.connected:=true;
finally
begin
showmessage('数据库连接失败');
application.terminate;
end;
end;
end;
就是建一个连接到master数据库,能连上就ok.小弟技艺尚,请楼下高手指点
adoconnection.connectstring:='........master...
try
adoconnection.connected:=true;
finally
begin
showmessage('数据库连接失败');
application.terminate;
end;
end;
end;
就是建一个连接到master数据库,能连上就ok.小弟技艺尚,请楼下高手指点
-----------------------------------------------------------------
我也是用chinaandys(天煞孤星&&蛋炒饭)的这种方法。
2.远程sql server貌似只能老老实实连了,不过建议连之前先ping一下(如果对方网管没屏蔽的话) ,免得碰上网络故障的情况白白等timeout。
3. 不是所有的sql server实例都是用tcp/ip协议通讯的,很有可能碰上named pipe通讯的,此时socket不管用的。
adoconnection.open
ping一下起码能排除网络故障,而且ping的速度比connection测试要快n倍。