(1)如何获得局域网中的Ms sqlserver和oracle 服务器名字列表,不用
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList:= SQLServer.ListAvailableSQLServers;?(好象必须装sqlserver
客户端或服务器才能用,装了后注册表才有“SQLDMO.Application”这一项)还有没有
别的的方法,不需装sqlserver客户端或服务器也可获取sqlserver服务器列表?(2)不用BDE中ssession组件获得odbc中的用户dsn和系统dsn列表项?
还有没有别的方法?如果通过编程如何实现?有代码最好。
解决方案 »
- 用delphi7开发了一个Activex控件,在网页中调用,控件中的函数也能正常执行,但是在IE关闭时报错?高手请进
- 急,如何讓自己的按鈕和Navigator同步?
- delphi 窗体中打开Excel??
- installshield 最全面最好用的版本是什么?
- 想写一个通用的代码生成控件的函数,我下面做的对不对?
- 一个很笨的问题
- 100分的问题!
- 怎样关闭正在运行的程序???
- interbase的user可以和数据库一起copy给用户吗?
- 为何delphi5 中不认MS Sql Server的nvarchar字段?
- 求救!!!delphi中的treeview组件没有nodeclick事件,怎么办?
- Delphi图片资源释放问题,高手请进!
http://www.applevb.com/sourcecode/getallserveronnet.zip
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;
不好意思小弟没有学过vb,所以不太明白你给的程序。不过你的意思是否是先找出局域网的所有机器,然后再逐一测试是否是sqlserver服务器。如果是,如何用delphi实现测试是否是sqlserver服务器?小弟刚学delphi刚一个月,有很多东西还不明白。还有为什么我的问题点数只能给100,小弟想加分都不行(本人才第一次发贴提问,所以不清楚)。
大侠能否把完全正确的delphi原码片段给小弟,谢谢了。
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;
2.在注册表里查一下,ODBC键值可以找到,然后读出即可!