请问如何获得网络内SQL server的服务器(本机未安装SQL Server的情况下)

解决方案 »

  1.   

    Function GetSQLServerList(var List: Tstringlist): boolean;
    var
      i: integer;
      sRetValue: String;
      SQLServer: Variant;
      ServerList: Variant;
    begin
      Result := False;
      List.Clear;
      try
        SQLServer := CreateOleObject('SQLDMO.Application');
        ServerList := SQLServer.ListAvailableSQLServers;
        for i := 1 to Serverlist.Count do
            list.Add (Serverlist.item(i));
        Result := True;
      Finally
        SQLServer := NULL;
        ServerList := NULL;
      end;
    end;
      

  2.   

    我要求的是本机未安装SQL Server的情况下
      

  3.   

    如果在nt, 2k, xp下,可用如下解法:
    const
         SV_TYPE_SQLSERVER           = $00000004;
    type
      pDword = ^DWord;
      NET_API_STATUS = DWORD;
      SERVER_INFO_100 = record
         sv100_platform_id : DWord;
         sv100_name        : pwidechar;
      end;  PSERVER_INFO_100  = ^SERVER_INFO_100;
      LPSERVER_INFO_100 = ^SERVER_INFO_100;
      ASERVER_INFO_100  = array of SERVER_INFO_100;  SERVER_INFO_101 = record
        sv101_platform_id   : dword;
        sv101_name          : pwidechar;
        sv101_version_major : Dword;
        sv101_version_minor : Dword;
        sv101_type          : dword;
        sv101_comment       : pchar;
      end;  PSERVER_INFO_101  = ^SERVER_INFO_101;
      LPSERVER_INFO_101 = ^SERVER_INFO_101;
      ASERVER_INFO_101  = array of SERVER_INFO_101;
    function NetServerEnum(servername : pchar; level : Dword; var bufptr;
       prefmaxlen : integer; entriesread : pDword; totalentries : pDword;
         servertype : DWord; domain : pwidechar; resume_handle : integer)
    :   NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetServerEnum';function NetApiBufferFree (Buffer : pointer) : NET_API_STATUS;
    stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
    procedure EnumNetwork(ts: TStrings);
    var
       pBuf    : pByte;
       aBuf    : ASERVER_INFO_100;
       dwEntriesRead : DWORD;
       dwTotalEntries : DWORD;
       dwServerType : DWORD;
       i : DWORD;
       name : string;
    begin
       pBuf := nil;
       dwEntriesRead := 0;
       dwTotalEntries := 0;
       dwServerType := SV_TYPE_SQLSERVER; // all servers   NetServerEnum(nil, 100, pBuf, -1,
         @dwEntriesRead, @dwTotalEntries, dwServerType, nil, 0);   aBuf := ASERVER_INFO_100(pBuf);   for i := 0 to dwEntriesRead - 1 do
         begin
           name := aBuf[i].sv100_name;
           ts.add(name);
           // name is the name of the SQL Server in the network
         end;
       if Assigned(pBuf) then NetApiBufferFree(pBuf);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      EnumNetwork(ListBox1.items);
    end;
      

  4.   

    总不能连SQL 客户端也不装吧?
      

  5.   

    偶也收藏ed.
    谢谢,至少在装了SQL Server的PC上有用:)
      

  6.   

    aiirii(ari) 的答案在NT内核的平台上可解决我的问题,但98下如何解决呢?
      

  7.   

    我當時是在 VC 版回答這個問題的, 我找過了, 不知道為什麼不見了!
    具體你可到這裹問樓主, 我也是回答他的問題的http://expert.csdn.net/Expert/topic/2415/2415164.xml?temp=.1251795
      

  8.   

    监听端口可能是个解决的办法不知delphi里该怎么写
      

  9.   

    To aiirii(ari):
    怎么我在用时,在这句老是有错呀?
      ts.add(name);调试时,name已经取得第一台SQL Server的名称了,但在执行ADD时会出错。
    在D6中运行时提示:
    Project Project1.exe raised exception class EAccessViolation with message 
    'Access violation at address 00401D0F in module 'Project1.exe'. Read of 
    address 7A83668E'. Process stopped. Use Step or Run to continue.为什么?
      

  10.   

    是哪一个对象没有CREATE吧;
      出现这个问题我都是这么解决的。
      

  11.   

    用DBEXPRESS的SQLCONNECTION组件的COMPUTERNAME属性,应该可以找得到网络上的主机,然后再组件的其他的属性里可以设置到SQL的服务器名.
      

  12.   

    >>怎么我在用时,在这句老是有错呀?
    將下面這句注釋掉試試
    if Assigned(pBuf) then NetApiBufferFree(pBuf);
      

  13.   

    // 获取活动的 SQL Server 服务器列表
    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(out 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
        if  Trim(pwcServerName) = '' then
          pwcServerName := nil;    if Trim(pwcDomain) = '' then
          pwcDomain := nil;    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) and (pReturnSvrInfo <> nil) then
          begin
            pCurSvrInfo := pReturnSvrInfo;        // 循环取得所有服务
            i := 0;
            j := dwEntriesRead;
            while i < j do
            begin
              if pCurSvrInfo = nil then
                Break;          with AList do
                Add(pCurSvrInfo^.sv100_name);          Inc(i);
              Inc(pCurSvrInfo);
            end;
          end;
        finally
          if Assigned(pReturnSvrInfo) then
            NetApiBufferFree(pReturnSvrInfo);
        end;
      except
        Result := False;
      end;
    end;用法如下:
    var
      List: TStringList;
      lstBox: TListBox;
    begin
      List := TStringList.Create;
      try
        GetSQLServerList(List);
        lstBox.Items := List;
      finally
        List.Free;
      end;
    end;
      

  14.   

    你看我的代碼, 
    EnumNetwork(ListBox1.items);你應該在你的窗體上放一個 ListBox1將下面這句注釋掉試試
    if Assigned(pBuf) then NetApiBufferFree(pBuf);
      

  15.   

    用superscan扫描1433端口(哈哈,方便的黑客方法)