请各位大虾帮忙。
小弟急用

解决方案 »

  1.   

    一般来说,计算机里面都有'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;
      

  2.   

    你可以检测注册表信息。 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。
    建议使用第一种方式。