如何得到所有活动的sqlserver服务器名,就像sql自己的服务管理器一样,如果服务没有启动的话再启动服务

解决方案 »

  1.   

    Function GetSQLServerList(var List: Tstringlist): Boolean;
    Function GetSQLServerList(var List: Tstringlist): boolean;vari: integer;sRetValue: String;SQLServer: Variant;ServerList: Variant;beginResult := False;List.Clear;trySQLServer := CreateOleObject('SQLDMO.Application');ServerList := SQLServer.ListAvailableSQLServers;for i := 1 to Serverlist.Count dolist.Add (Serverlist.item(i));Result := True;FinallySQLServer := NULL;ServerList := NULL;end;end;
      

  2.   

    以前是安装了SQL Server 的没有安装的话,用以下方法:
    unit U_NetApi;interface
    uses
      types,windows,classes;type  NET_API_STATUS = DWORD;  PServerInfo100 = ^TServerInfo100;
      _SERVER_INFO_100 = record
          sv100_platform_id: DWORD;
           sv100_name: LPWSTR;
      end;  {$EXTERNALSYM _SERVER_INFO_100}
      TServerInfo100 = _SERVER_INFO_100;
      SERVER_INFO_100 = _SERVER_INFO_100;
      {$EXTERNALSYM SERVER_INFO_100}const
      NERR_Success = 0;
      MAX_PREFERRED_LENGTH = DWORD(-1);
      SV_TYPE_SQLSERVER    = $00000004;function NetApiBufferAllocate(ByteCount: DWORD; var Buffer: Pointer):
      NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetApiBufferAllocate';function NetServerEnum(ServerName: LPCWSTR; Level: DWORD; var BufPtr: Pointer;
      PrefMaxLen: DWORD; var EntriesRead: DWORD; var TotalEntries: DWORD;
      ServerType: DWORD; Domain: LPCWSTR; ResumeHandle: PDWORD): NET_API_STATUS;
      stdcall; external 'netapi32.dll' name 'NetServerEnum';function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external
    'netapi32.dll' name 'NetApiBufferFree';function GetSQLServerList(var AList: TStrings; pwcServerName: PWChar = nil;
      pwcDomain: PWChar = nil): Boolean;implementationfunction GetSQLServerList(var AList: TStrings; pwcServerName: PWChar = nil;
      pwcDomain: PWChar = nil): Boolean;
    var
      NetAPIStatus: DWORD;
      dwLevel: DWORD;
      pReturnSvrInfo: Pointer;
      dwPrefMaxLen: DWORD;
      dwEntriesRead: DWORD;
      dwTotalEntries: DWORD;
      dwServerType: DWORD;
      dwResumeHandle: PDWORD;
      pCurSvrInfo: PServerInfo100;
      i, j: Integer;
    begin
      Result := True;
      try
        dwLevel := 100;
        pReturnSvrInfo := nil;
        dwPrefMaxLen := MAX_PREFERRED_LENGTH;
        dwEntriesRead := 0;
        dwTotalEntries := 0;
        dwServerType := SV_TYPE_SQLSERVER;    //服务器类型
        dwResumeHandle := nil;    NetApiBufferAllocate(SizeOf(pReturnSvrInfo), pReturnSvrInfo);
        try
            NetAPIStatus := NetServerEnum(pwcServerName, dwLevel, pReturnSvrInfo,
                            dwPrefMaxLen, dwEntriesRead, dwTotalEntries, dwServerType, pwcDomain,
                            dwResumeHandle);
            if ((NetAPIStatus = NERR_Success) or (NetAPIStatus = ERROR_MORE_DATA)) and
                   (pReturnSvrInfo <> nil) then
            begin
                   pCurSvrInfo := pReturnSvrInfo;
                   // 循环取得所有SQL Server服务器
                   i := 0;
                   j := dwEntriesRead;
                   while i < j do
                   begin
                     if pCurSvrInfo = nil then
                        Break;
                     //with AList do
                        AList.Add (pCurSvrInfo^.sv100_name);
                        Inc(i);
                        Inc(pCurSvrInfo);
                  end;
             end;
        finally
          if Assigned(pReturnSvrInfo) then
            NetApiBufferFree(pReturnSvrInfo);
        end;
      except
        Result := False;
      end;
    end;
    end.