如何用delphi语句实现,检测该机是否安装sql server?

heaven765 2003-08-24 12:26:30
请各位大虾帮忙。
小弟急用
...全文
142 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
baguli 2003-08-24
  • 打赏
  • 举报
回复
一般来说,计算机里面都有'ntwdblib.dll'链接库,里面有一个枚举函数,可以返回局域网安装SQL Server的计算机列表。我以前写了一个单元,用于检测局域网已安装SQL Server所有的计算机,或者某台计算机是否安装SQLServer,你可以试一试:先用GetComputerName获取本机计算机名,然后将计算机名传递给SQLServerAvailable。

源代码如下:

unit SQLAPI;

interface

uses Windows, Classes, Sysutils, Dialogs;

type UShort = Word;
type PShort = ^Short;
type LPShort = PShort;
type PUShort = ^UShort;
type LPUShort = PUShort;

const LOC_SEARCH = $0001;
const NET_SEARCH = $0002;

const ENUM_SUCCESS = $0000;
const MORE_DATA = $0001;
const NET_NOT_AVAIL = $0002;
const OUT_OF_MEMORY = $0004;
const NOT_SUPPORTED = $0008;
const ENUM_INVALID_PARAM = $0010;

function SQLServerAvailable(const ServerName: string): Boolean;
function GetSQLServerNames(const AList: TStrings): Integer;

implementation

function GetSQLServerNames(const AList: TStrings): Integer;
var Entries: UShort;
Buffer: array[0..4095] of Char; //4K缓冲区,我想足够了
nLoop: Integer;
pServer: PChar;
hInst: HModule;
_dbserverenum: function(SearchMode: UShort; szBuff: PChar;
cbSizeBuff: UShort; nEntries: LPUShort): Integer; stdcall;

begin
Result := NOT_SUPPORTED;
hInst := LoadLibrary('ntwdblib.dll');
if hInst <> 0 then
begin
Entries := Length(Buffer);
ZeroMemory(@Buffer, Entries);
try
@_dbserverenum := GetProcAddress(hInst, 'dbserverenum');
if Assigned(_dbserverenum) then
Result := _dbserverenum(NET_SEARCH or LOC_SEARCH, Buffer, Entries, @Entries);
finally
FreeLibrary(hInst);
end;
if (Result = ENUM_SUCCESS) and (Entries > 0) then
begin
pServer := Buffer;
for nLoop := 1 to Entries do
begin
AList.Add(UpperCase(pServer));
Inc(pServer, StrLen(pServer) + 1);
end;
end else Result := NOT_SUPPORTED;
end else MessageBox(GetDesktopWindow, '可能没有安装SQL Server客户端程序', '错误提示' ,
MB_OK or MB_ICONWARNING or MB_TOPMOST or MB_SETFOREGROUND);
end;

function SQLServerAvailable(const ServerName: string): Boolean;
var AList: TStringList;
AServer: String;
begin
AServer := UpperCase(ServerName);
AList := TStringList.Create;
Result := GetSQLServerNames(AList) = ENUM_SUCCESS;
if Result then
try
Result := AList.IndexOf(AServer) <> -1;
finally
FreeAndNil(AList);
end;
end;

heaven765 2003-08-24
  • 打赏
  • 举报
回复
谢谢了
wcq8303 2003-08-24
  • 打赏
  • 举报
回复
你可以检测注册表信息。 HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MICROSOFT SQL SERVER\80\Registration 下的CD_KEY 是否为空!
Procedure test_sql;
var
reg:Tregistry;
cdkey:String;
begin
reg:=Tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
try
reg.OpenKey('SOFTWARE\MICROSOFT\MICROSOFT SQL SERVER\80\Registration',false);
cdkey:=reg.ReadString('CD_KEY');
reg.CloseKey;
if cdkey=NULL then showMessage('未安装SQL SERVER!')
else showMessage('安装了SQL SERVER!') ;
except
showMessage('未安装SQL SERVER!');
end;
reg.Free;
end;
另外,你还可以通过启动SQL SERVER可检测,我们知道,SQL SERVER下的当前用户下必有一个叫MASTER的DATABASE,我们可以通过一个ADOCONNECTION来测试是否能够连接上该DB。在这之前必须启动SQL SERVER,可以用下列语句实现:WinExec('net start mssqlserver',0);
启动SERVER后,还不能ADOCONNECTION打开出现异常,我们就可以认为是没有SQL SERVER。
建议使用第一种方式。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧