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 //停止