Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> список SQL-серверов, как получить? 
:(
    Опции темы
Unregister
Дата 25.12.2003, 07:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет, ALL! Как получить список всех зарегистрированных sql-серверов (MSSQL2000)? В нет-е накопал способ через вызов оле-объекта SQLDMO.Application, но он не подходит, т.к. на машине пользователя должна быть зарегистрирована библиотека sqldmo.dll (а она регистрируется при установке mssqlserver, зарегистрировать через regsvr32 не получается). Как быть? Точнее, понятно, что надо будет использовать odbc, а вот как я не знаю. Спасибо.

ps функцию PromptDataSource не предлагайте. У меня свой диалог будет

Спасибо
  Вверх
Ars
Дата 25.12.2003, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Незнаю, как это должно выглядеть в Паскале, на С вот так:
Код
void __fastcall TMainForm::GetSqlServers(void)
{
DWORD EntriesRead,TotalEntries;
SERVER_INFO_100 *SrvInfo=NULL;
NET_API_STATUS Stat=NetServerEnum(NULL,100,(BYTE **)&SrvInfo,
 256*sizeof(SERVER_INFO_100),&EntriesRead,&TotalEntries,
 SV_TYPE_SQLSERVER,NULL,0);
CBServers1->Clear();
if(Stat==NERR_Success || Stat==ERROR_MORE_DATA)
{
 for(DWORD i=0;i<EntriesRead;i++)
  CBServers1->Items->Add(SrvInfo[i].sv100_name);
 Stat=NetApiBufferFree(SrvInfo);
 CBServers1->ItemIndex=0;
}
if(!CBServers1->Items->Count) CBServers1->Text="Server";
}

Правда, здесь нет обработки ERROR_MORE_DATA, но врядли кол-во серверов может быть очень большим


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Unregistered
Дата 25.12.2003, 11:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо. Жаль в Дельфи нет описания этой функции. Попробую юзать Netapi32.dll sad.gif Она там вроде декларирована?

А используя ADO? Неужели никто с такой проблемой не сталкивался?
  Вверх
Unregistered
Дата 26.12.2003, 02:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Господа программеры! Давайте думать! В нет-е куча подобных вопросов, а ответы прямо скажем не очень-то. (извини Ars, но мне в дельфи эту функцию поднять проблематично будет, я посмотрел ее описание). Вот еще слышал про mssql32.pas, с помощью него можно, может есть у кого?
  Вверх
Петрович
Дата 26.12.2003, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Ничего неподъемного нет. См библиотеку JCL. Там есть модуль LM.pas, в нем-то и описана функция NetServerEnum и связанные с ней константы.
Ну а что-то вроде примера Ars'a но на Delphi выглядит приблизительно так:
Код
procedure EnumServers(ServersList :TString);
var
 pBuf :Pointer;
 EntriesRead, TotalEntries, ResumeHandle :Cardinal;
 NetRes :NET_API_STATUS;
 EntryPoint :PServerInfo101;
begin
 pBuf := nil;
 ResumeHandle := 0;
 try
   NetRes := NetServerEnum (Nil,101,pBuf,High(Cardinal),EntriesRead,TotalEntries
                   ,SV_TYPE_SQLSERVER,nil,@ResumeHandle);

   if  not (NetRes in [NERR_Success,ERROR_MORE_DATA]) then
     raise Exception.CreateFmt('Error %d NetServerEnum',[NetRes]);

   if  pBuf <> nil  then begin
     EntryPoint := pBuf;
     while  EntriesRead > 0  do begin
       ServersList.Add(EntryPoint^.sv101_name);
       Inc(EntryPoint);
       Dec(EntriesRead);
     end;
   end;

 finally
   if pBuf <> nil  then  NetApiBufferFree(pBuf);
 end;

end;

Соответственно пользоваться можно так:
Код

 ...
 Memo1.Clear;
 EnumServers(Memo1.Lines);
 ...



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Unregistered
Дата 26.12.2003, 09:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











JCL? Ага, щас возьму и посмотрю. Хоть ссылку кинул-бы где ее искать. И к чему твой пример, тож не понятно... если описания типов нету. Что за NET_API_STATUS? или PServerInfo101? А параметры в функцию подставить не проблема, даже для меня убогово.
  Вверх
Vit
Дата 26.12.2003, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207





--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Unregistered
Дата 29.12.2003, 10:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Кому интересно, вот что получилось:
Код

unit MyNetApi;

interface
uses Windows;

const
 SV_TYPE_WORKSTATION = $00000001;// All LAN Manager workstations
 SV_TYPE_SERVER = $00000002;// All LAN Manager servers
 SV_TYPE_SQLSERVER = $00000004;// Any server running with Microsoft SQL Server
 SV_TYPE_DOMAIN_CTRL = $00000008;// Primary domain controller
 SV_TYPE_DOMAIN_BAKCTRL = $00000010;// Backup domain controller
 SV_TYPE_TIMESOURCE = $00000020;// Server running the Timesource service
 SV_TYPE_AFP = $00000040;// Apple File Protocol servers
 SV_TYPE_NOVELL = $00000080;// Novell servers
 SV_TYPE_DOMAIN_MEMBER = $00000100;// LAN Manager 2.x Domain Member
 SV_TYPE_LOCAL_LIST_ONLY = $40000000;// Servers maintained by the browser
 SV_TYPE_PRINT = $00000200;// Server sharing print queue
 SV_TYPE_DIALIN = $00000400;// Server running dial-in service
 SV_TYPE_XENIX_SERVER = $00000800;// Xenix server
 SV_TYPE_MFPN = $00004000;// Microsoft File and Print for Netware
 SV_TYPE_NT = $00001000;// Windows NT (either Workstation or Server)
 SV_TYPE_WFW = $00002000;// Server running Windows for Workgroups
 SV_TYPE_SERVER_NT = $00008000;// Windows NT non-DC server
 SV_TYPE_POTENTIAL_BROWSER = $00010000;// Server that can run the Browser service
 SV_TYPE_BACKUP_BROWSER = $00020000;// Server running a Browser service as backup
 SV_TYPE_MASTER_BROWSER = $00040000;// Server running the master Browser service
 SV_TYPE_DOMAIN_MASTER = $00080000;// Server running the domain master Browser
 SV_TYPE_DOMAIN_ENUM = $80000000;// Primary Domain
 SV_TYPE_WINDOWS = $00400000;// Windows 95 or later
 SV_TYPE_ALL = $FFFFFFFF;// All servers


type
 TServer_Info_101 = record
 sv101_platform_id : integer;
 sv101_name : PWideChar;
 sv101_version_major,
 sv101_version_minor,
 sv101_type : DWord;
 sv101_comment : PWideChar;
end;
TServerInfs101 = array [1..($1FFFFFFF div SizeOf( TServer_Info_101 ))] of TServer_Info_101;

function NetServerEnum( ServerName : PWideChar; Level : longint;var BufPtr : Pointer; PrefMaxLen : longint;var EntriesRead, TotalEntries : longint;ServType : longint; Domain : PWideChar;var ResumeHandle : integer ) : longint;stdcall;external 'netapi32.dll' name 'NetServerEnum';
function NetApiBufferFree(pBuff:Pointer):integer;stdcall;external 'netapi32.dll' name 'NetApiBufferFree';

implementation

end.



вызов....

Код

procedure getServersList(List:TStrings;SvrType:longint;Domain:PWideChar);
var  pBuf:Pointer;
    EntriesRead,TotalEntries,resumeHandle:longint;
    i,netstat:integer;
begin
netstat:=NetServerEnum(nil,101,pBuf,-1,EntriesRead,TotalEntries,SvrType,Domain,ResumeHandle);
For i:=1 to EntriesRead do
 begin
   With TServerInfs101(pBuf^)[i] do
   begin
   List.Add(sv101_name);
   end;
 end;
 NetApiBufferFree(pBuf);
end;

.....................

procedure TForm1.Button1Click(Sender: TObject);
begin
  getServersList(Memo1.Lines,SV_TYPE_SQLSERVER,'ASU');
end;


Нет проверки на netstat, а в остальном вроде работает.
  Вверх
Петрович
Дата 29.12.2003, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
Нет проверки на netstat, а в остальном вроде работает.

Для страховки, перед вызовом NetServerEnum надо ResumeHandle присвоить 0 (см.MSDN), поскольку начальное значение локальных переменных неопределено, и однажды может быть не равно 0.
А в остальном неплохо.
P.S. Еще, забыл отметить что по утверждению MSDN NetServerEnum отсутствует под Win95/98.

Это сообщение отредактировал(а) Петрович - 29.12.2003, 15:30


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Jonny
Дата 22.9.2005, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 3.8.2005

Репутация: нет
Всего: нет



Вот рыскал по форуму и нашел давнишний топик. Спасибо авторам сильно помогли. Но возникла новая проблема. Даная процедура выводит список в конкретном домене, который мы сами и объявляем, к примеру как 'ASU' .
1. Как сделать что бы имя домена подставлялося автоматически.
2. И как быть если необходим спиок серверов из более чем 35 доменов?
Заранее благодарен за ответы.
PM MAIL   Вверх
Jonny
Дата 22.9.2005, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 3.8.2005

Репутация: нет
Всего: нет



И еще хотелось бы вот что добавить. Скачал http://citkit.dl.sourceforge.net/sourcefor...758Complete.zip ... но к моему разочарованию LM.pas не обнаружил. Что не так?
PM MAIL   Вверх
SergeBS
Дата 22.9.2005, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



Такая же тема есть в MS SQL server
PM MAIL   Вверх
SergeBS
Дата 22.9.2005, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



Пардон, что-то не найду smile
Ладно, еще раз закину код. Учтите - я его не проверял. Не нужно мне это.

Код

Find all MSSQL Server actual available
How to list all active MSSQL server 
Product: Delphi all versions Category:
Database-SQL Skill Level:
Last Update: 01/11/2004 
How is it possible to get a list of all active MSSQL server actual on network. 
Answer:
In addition of the article 2385 of Tommy Andersen and sample of SQL-Ping from Chip Anderson, Michael Choi and Rajiv Delwadia "http://www.sqlsecurity.com". This little program runs without any additional like SQL-DMO or else. It is very quickly and look over domain ranges. 
>>> You need a Button and a listbox on the form for this sample.<<< 

unit Unit1; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  Winsock, StdCtrls, ScktComp; 

Const 
  CM_SocketCallBack = WM_App + 600; 

type 
  TClearSocketThread = class(TThread) 
  private 
    waitTime:Integer; 
    socket:Integer; 
  protected 
    procedure Execute; override; 
  public 
    constructor Create(s,w:Integer); 
  end; 

  TForm1 = class(TForm) 
    ListBox1: TListBox; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
  private 
    Procedure CMSocketCallBack(Var Msg: TMessage); Message CM_SocketCallBack; 
  public 
    s:Integer; 
  end; 

var 
  Form1: TForm1; 

implementation 

{$R *.DFM} 

constructor TClearSocketThread.Create(s,w:Integer); 
begin 
  Socket:=s; 
  waitTime:=w; 
  FreeOnTerminate:=true; 
  inherited create(false); 
end; 

procedure TClearSocketThread.Execute; 
begin 
  sleep(waitTime); 
  closesocket(Socket); 
  WSACleanup; 
  windows.beep(4000,100); 
end; 
Procedure TForm1.CMSocketCallBack(Var Msg: TMessage); 
var 
  buffer:array [0..64000] of char; 
  str:String; 
  n:Integer; 
begin 
  fillchar(buffer,64000,0); 
  recv(s,buffer,sizeof(buffer),0); 
  str:=''; 
  for n:=3 to 64000 do begin 
    if buffer[n]=';' then begin 
      Listbox1.Items.Add(str); 
      str:=''; 
      continue; 
    end; 
    if buffer[n]=#0 then begin 
      Listbox1.Items.Add(str); 
      break; 
    end; 
    str:=str+buffer[n]; 
  end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
const 
  Address='255.255.255.255'; 
var 
  wsa_data:WSADATA; 
  SNDBUF:Integer; 
  TCPNODELAY:Integer; 
  BROADCAST:integer; 
  hostaddr: sockaddr_in; 
  buf:char; 
begin 
  Listbox1.items.clear; 
  WSAStartup(2,wsa_data); 
  //create a socket 
  s:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 
  //declare call back routine 
  WSAAsyncSelect(s,self.Handle,CM_SocketCallBack,FD_READ); 
  //setup 
  SNDBUF:=0; 
  TCPNODELAY:=1; 
  BROADCAST:=1; 
  setsockopt(s,SOL_SOCKET,SO_SNDBUF,PChar(@SNDBUF),sizeof(SNDBUF)); 
  setsockopt(s,SOL_SOCKET,TCP_NODELAY,PChar(@TCPNODELAY),sizeof(TCPNODELAY)); 
  setsockopt(s,SOL_SOCKET,SO_BROADCAST,PChar(@BROADCAST),sizeof(BROADCAST)); 
  hostaddr.sin_family     :=AF_INET; 
  hostaddr.sin_port       :=htons(1434); 
  hostaddr.sin_addr.s_addr:=inet_addr(PChar(Address)); 
  buf:=#02; //ping 
  //ask all maschines 
  sendto(s,buf,1,0,hostaddr,sizeof(hostaddr)); 
  TClearSocketThread.Create(s,5000); 
end; 

end. 


Copyright © 2000 - 2004 delphi3000.com - All rights reserved.




PM MAIL   Вверх
Sh@dow
Дата 26.9.2005, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.7.2004

Репутация: нет
Всего: 1



Работать то работает. Только тормозит малясь и спикер попискивает smile. Я лично использую пример отсюда : Delphist's FAQ (или как сейчас называют DRKB) --->Работа с сетью, интернетом, протоколами --->Как узнать имя домена Windows NT/2000?.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.