(1)如何获得局域网中的Ms sqlserver和oracle 服务器名字列表,不用
   SQLServer  :=  CreateOleObject('SQLDMO.Application');
   ServerList:=  SQLServer.ListAvailableSQLServers;?(好象必须装sqlserver
客户端或服务器才能用,装了后注册表才有“SQLDMO.Application”这一项)还有没有
别的的方法,不需装sqlserver客户端或服务器也可获取sqlserver服务器列表?(2)不用BDE中ssession组件获得odbc中的用户dsn和系统dsn列表项?
还有没有别的方法?如果通过编程如何实现?有代码最好。

解决方案 »

  1.   

    利用API获得当前网络中的所有计算机名称以及获得当前可用的服务器、SQL服务器、RAS服务器的名称、属性等。
    http://www.applevb.com/sourcecode/getallserveronnet.zip
      

  2.   

    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;
      

  3.   

    楼上说的是对的,但首先要把SQLDMO.DLL倒入到工程当中,SQLDMO.DLL一般放在SQL SERVER 2000的80/BINN文件夹下,倒入后,在工程中引用SQLDMO_TLB.PAS文件,就可以了,不知道你会不会倒入该文件!
      

  4.   

    to youercsdn(youer) 本人的本意是不需要sqlserver的任何东西也能找出sqlserver局域网的服务器。你说的SQLDMO.DLL如何倒入到工程当中,SQLDMO_TLB.PAS是否是引用SQLDMO.DLL的文件,本人没找到。
      

  5.   

    to TechnoFantasy(www.applevb.com) 
    不好意思小弟没有学过vb,所以不太明白你给的程序。不过你的意思是否是先找出局域网的所有机器,然后再逐一测试是否是sqlserver服务器。如果是,如何用delphi实现测试是否是sqlserver服务器?小弟刚学delphi刚一个月,有很多东西还不明白。还有为什么我的问题点数只能给100,小弟想加分都不行(本人才第一次发贴提问,所以不清楚)。
      

  6.   

    命令行(MS-DOS方式)下输入 OSQL -L
      

  7.   

    这个帖子绝对要看。http://expert.csdn.net/Expert/topic/2424/2424337.xml?temp=.6625482使用Socket广播取网内的SQL服务器列表。
      

  8.   

    to jxc163(一水寒) 
       大侠能否把完全正确的delphi原码片段给小弟,谢谢了。
      

  9.   

    uses winsock
      var s: string;
    procedure printf(s1: string);
    begin
      Form1.Memo1.Lines.Add(s1);
      Application.ProcessMessages;
    end;procedure decode_recv(buf: pchar; size: integer);
    var
      index: integer;
      counter: integer;
    begin
      counter := 0;
      s :=  s + #13#10;   
      for index := 3 to size - 1 do
      begin
        if ((buf[index] = ';') and (buf[index + 1] <> ';')) then
        begin
          //Look for a semi-colon and check for end of record (;;)
          if ((counter mod 2) = 0) then
          begin
            s := s + ' : ';
            inc(counter);
          end
          else
          begin
             s :=  s + #13#10;
            inc(counter);
          end;
        end
        else
        begin
          if (buf[index] <> ';') then
          begin
            // If an end of record (;;), then double-space for next instance
            s := s + buf[index];
          end
          else
          begin
             s :=  s + #13#10;
          end;
        end;
      end;
    end;procedure listen(v: pointer);
    const
      buffersize = 64000;
    var
      buffer: array[0..buffersize] of char;
      s: TSocket;
      udpfrom: sockaddr_in;
      udpfromlen, n, e: integer;
    begin
      s := TSOCKET(v^);
      while true do
      begin
        udpfromlen := sizeof(udpfrom);
        n := recvfrom(s, buffer, sizeof(buffer), 0, udpfrom, udpfromlen);
        e := WSAGetLastError();
        if ((n > 0) and (e = 0)) then
          decode_recv(buffer, n);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      WSAData: TWSADATA;
      sock: TSOCKET;
      addr_in: TSockAddrIn;
      buf: array[0..4] of char; //={'\x02'};
      listener: THANDLE;
      ThreadId: DWORD;
      SNDBUF, TCPNODELAY, BROADCAST: integer;
    begin
      s := '';
      buf[0] := #2;
      buf[1] := #0;
      buf[2] := #0;
      buf[3] := #0;
      buf[4] := #0;
      SNDBUF := 0;
      TCPNODELAY := 1;
      BROADCAST := 1;
      if (WSAStartup(MAKEWORD(2, 0), WSAData) <> 0) then
      begin
        showMessage('WSAStartup error.Error:' + IntToStr(WSAGetLastError));
        exit;
      end;  sock := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
      if (sock = INVALID_SOCKET) then
      begin
        showMessage('Socket failed.Error:' + IntToStr(WSAGetLastError));
        exit;
      end;   addr_in.sin_family  :=  AF_INET;
       addr_in.sin_port  := $9A05;
     addr_in.sin_addr.S_addr := Inet_Addr(Pchar('192.168.0.255'));  if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, pchar(@SNDBUF), sizeof(SNDBUF)) = SOCKET_ERROR) then
      begin
        showMessage('Set SO_SNDBUF failed.Error:' + IntToStr(WSAGetLastError));
        exit;
      end;  if (setsockopt(sock, SOL_SOCKET, TCP_NODELAY, pchar(@TCPNODELAY), sizeof(TCPNODELAY)) =
        SOCKET_ERROR) then
      begin
        showMessage('Set TCP_NODELAY failed.Error:' + IntToStr(WSAGetLastError));
        exit;
      end;  if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, pchar(@BROADCAST), sizeof(BROADCAST)) =
        SOCKET_ERROR) then
      begin
        showMessage('Set SO_BROADCAST failed.Error:' + IntToStr(WSAGetLastError));
        exit;
      end;  listener := beginthread(nil, 2048, @listen, @sock, 0, ThreadId);  Application.ProcessMessages;
      if (sendto(sock, buf, sizeof(buf), 0, addr_in, sizeof(addr_in)) = SOCKET_ERROR) then
      begin
        showMessage('Send failed.Error:' + IntToStr(WSAGetLastError));
        exit;
      end;  printf('Listening....');  WaitForSingleObject(listener, 5000);  WSACleanup();
      CloseHandle(listener);
      printf(s);
      printf('SQLPing Complete.\n');
    end;
      

  10.   

    1.有一段函数可以,自己找找。
    2.在注册表里查一下,ODBC键值可以找到,然后读出即可!