如何用delphi语句实现,检测该机是否安装sql server? 请各位大虾帮忙。小弟急用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般来说,计算机里面都有'ntwdblib.dll'链接库,里面有一个枚举函数,可以返回局域网安装SQL Server的计算机列表。我以前写了一个单元,用于检测局域网已安装SQL Server所有的计算机,或者某台计算机是否安装SQLServer,你可以试一试:先用GetComputerName获取本机计算机名,然后将计算机名传递给SQLServerAvailable。源代码如下:unit SQLAPI;interfaceuses 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;implementationfunction 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; 你可以检测注册表信息。 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。建议使用第一种方式。 如果将数据转置成指定的报表格式,谢谢 webservice全局接口问题 请问Assinged与nil的区别? 关于画圆的问题 怎么修改ADT文件的表结构? 如果制作一个dll,让ie启动时它也随之启动,ie关闭时它也随之关闭,ie打开新网页时,它能得到新打开网页的事件并得到新网页的url? 给记录排序的问题 请推荐几本delphi的好书。 谁有 http , ftp下载程序的源代码,高分享用 delphi超级小菜鸟的问题 我的可用分怎么才20分,可用分是根据什么来加的? Access的SQL命令如何引用另一个带密码的MDB文件?
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;implementationfunction 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;
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。
建议使用第一种方式。