之前把程序加入开机启动项是有时会因数据库没有完全启动好而导致程序启动失败,为此之前写了一个批处理延时启动,后来想想还是完善写一个服务保护程序好了,所以在启动程序前要判断数据库是否正常启动,考虑了下面几种思路:
- 检测数据库IP端口是否正常开放,比如用telnet命令(不能用Telnet,因为有些电脑没有安装此命令);
- 检查进程中是否有sqlserver.exe进程,但不能保证数据库配置文件中连接是正确的,并且也可能存在数据库服务暂停时无法判断;
- 直接用TADOConnect测试连接是否正常,此法最全面,但注意该控件的用法,最终采用次方法。
其中找到以下几个连接的文章,对我最终实现帮助很大Delphi ADOConnection连接
注意设置ADOconn.ConnectionString:='Provider=SQLOLEDB.1;User ID='+UserIDstr+';Password='+Passwordstr+ ';Data Source='+ServerNameStr+ ';Initial Catalog='+DatabaseNamestr;属性,然后用下面方法即可
try
adocon1.Connected:=True;
except
on E:exception do
Showmessage(E.message)
end;
delphi 判断SQL Server 服务器是否安装与开启这篇文章分析写的也很好,摘录如下:
1. 问题简介:
一般情况下,使用程序连接数据库的时候,当数据库服务器不存在,或者数据库服务器没有启动的时候,
会导致数据库连接失败,所花费的时间很长。所以,在进行连接前,有必要对这些做出判断,然后返回给用户一
个正确的提示信息,减少等待的时间。
2. 数据库服务器连接不上,可以分成以下几种情况:
1>. 根本就不存在数据库服务器,及系统根本就没有安装数据库服务器。
2>. 系统安装了数据库服务器,但是数据库服务器没有开启。
3>. 数据库服务器开启了,但是处于【暂停】或者【停止】的状态。
4>. 当然还有最常见的,就是连接信息有问题。
解决办法:
1.最简单的办法,直接使用异常提供的信息,Delphi的异常中,提供的错误类型很完善。
例如:
procedure TForm1.btn1Click(Sender: TObject);
begin
try
adocon1.Connected:=True;
except
on E:exception do
Showmessage(E.message)
end;
end;
注意:
但是在数据库服务【停止】或者【未安装】的情况下,由于连接数据库抛出异常有一个超时时间,
所以提示用户连接不上所需时间很长,所以可以先判断是否安装,和数据库服务器是否开启(需要以下办法),
然后又异常来判断服务器是在【启动】状态,还是在【暂停】状态。
2.通过注册表判断系统是否安装了SQL Server数据库。
uses Registry;
procedure TForm1.btn1Click(Sender: TObject);
var
ARegistry: Tregistry;
cdkey:string;
begin
ARegistry := Tregistry.Create;
ARegistry.RootKey := HKEY_LOCAL_MACHINE;
try
ARegistry.OpenKey('SOFTWARE\MICROSOFT\MICROSOFT SQL SERVER\80\Registration', False);
cdkey := ARegistry.ReadString('CD_KEY');
if cdKey ='' then
showmessage('没有安装SQL Server数据库')
else
showmessage('安装了SQL Server数据库')
except
ARegistry.Destroy;
end;
end;
注意:<1>.如果安装的是绿色版,注册表中不存在信息,不可以使用这种办法。
<2>.安装SQL Server之后卸载,注册表中的信息没有修改,所以判断可能是不正确,会提示已经安装。
3. 通过进程判断SQL Server数据库服务器是否开启
uses Tlhelp32;
procedure TForm1.Button1Click(Sender: TObject);
var
ProcessList : Thandle;
pe : TPROCESSENTRY32;
ProcList : TStringList;
i : integer;
begin
ProcList := TStringList.Create;
try
ProcessList := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize := sizeof(TPROCESSENTRY32);
if process32first(ProcessList,pe) then
begin
ProcList.Add(pe.szexefile);
while process32next(ProcessList,pe) do
ProcList.Add(pe.szexefile);
end;
for i := 0 to ProcList.Count -1 do
if ProcList[i] = 'sqlservr.exe ' then
ShowMessage( 'SQL Server already Run! ');
finally
ProcList.Free;
end;
end;
注意:SQL Server服务器的三种状态:
<1>.【启动】:进程中有 'sqlservr.exe',能进行访问连接。
<2>.【暂停】:进程中有 'sqlservr.exe',不能进行访问连接。
<3>.【停止】:进程中没有 'sqlservr.exe',不能进行访问连接。
在【暂停】或者【停止】的暂停下,不允许进行连接。
scm -action 1 -slient 1 -service mssqlserver //启动
scm -action 6 -slient 1 -service mssqlserver //停止