Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

Список SQL серверов   Найти похожие ветки 

 
Zik   (2007-07-02 15:41) [0]

Всем добрых суток. Задача: Необходимо получить список всех доступных SQL серверов в сети и доступные базы на выбранном сервере (наподобие выбора в cвойствах ADOConnection).


 
clickmaker ©   (2007-07-02 16:07) [1]

o := CreateOleObject("SQLDMO.Application");
l := o.ListAvailableSQLServers();
for i := 1 to l.Count do
 s := l.Item(i);

примерно так


 
MsGuns ©   (2007-07-02 22:42) [2]

 // Дескриптор SQL-сервера
 PMSSQLServerDef = ^RMSSQLServerDef;
 RMSSQLServerDef = record
   ServerName: string;          // Имя сервера
   InstanceName: string;        // Установочный ид-р сервера
   IsClustered: boolean;        // Флаг включения в серверный кластер
   Version: RSQLServerVersion;  // Версия сервера
   Port: integer;               // Коммуникационный порт
   Path: string;                // Путь к серверу в сети
 end;

procedure SQLServ_GetServersList(SQLServerList: TList);
//  Процедура посылает по сети широковещательный запрос по порту 1434 и ждет
//  100 мс, затем буфер сокета, просматривается на наличие "ответов" от MS SQL Server
//  Кажый пакет извлекается в буфер в виде строки, парсируется и информация
//  заполняет декскриптор PMSSQLServerDef, который добавляется в список,
//  адрес которого указан вх.параметром
var
 hSocket: TSocket;
 WSAData: TWSAData;
 Buf: array[0..65535] of byte;
 i, tRes, tLenSA, tLenBufRecv: integer;
 tLenBufIOCTL: u_long;
 S: AnsiString;
 saSQLSend, saSQLRecv: sockaddr_in;
 Data: byte;
 ServDef: PMSSQLServerDef;
 ls: TStrings;

const
 fBroadcast: boolean = True;

begin
 // Очистка списка серверов
 for i := 0 to SQLServerList.Count-1 do
   Dispose(PMSSQLServerDef(SQLServerList[i]));
 SQLServerList.Clear;
 Data := $02;
 WSAStartup(MakeWord(2,2), WSAData);    // Инициализация Win DLL версии 2.2. (WS2_32.DLL)
 //Получение дескриптора сокета UDP
 hSocket := Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 if (hSocket = INVALID_SOCKET) then exit;
 //Установка опций сокета
 tRes := setsockopt(hSocket, SOL_SOCKET{IPPROTO_TCP}, SO_BROADCAST, @fBroadcast, sizeof(BOOL));
 if (tRes = SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
 //Установка данных служебной структуры  sockaddr_in
 saSQLSend.sin_family  := AF_INET;
 saSQLSend.sin_port := htons(1434);
 saSQLSend.sin_addr.s_addr := htonl(INADDR_BROADCAST);
 //Посылка широковещательного сообщения
 tRes := sendto(hSocket, Data, 1, 0, saSQLSend, sizeof(SOCKADDR_IN));
 if (tRes = SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
 Sleep(100);  // Ожидание ответа на пакет-запрос
 tRes := ioctlSocket(hSocket,FIONREAD,tLenBufIOCTL);  // Опрос состояния сокета
 if (tRes = SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
 if (tLenBufIOCTL>0) then // В буфере сокета (порта) есть данные
   begin
    tLenSA := sizeof(SOCKADDR_IN);
    saSQLRecv := saSQLSend;
    while tLenBufIOCTL>0 do  // Пока не просмотрен весь буфер
      begin
       // Чтение очередного пакета из буфера сокета
       tLenBufRecv := recvfrom(hSocket, Buf, 65535, 0, saSQLRecv, tLenSA);
       // Уменьшение буфера на длину считанных данных (типа удаление пакета из буфера)
       tLenBufIOCTL := tLenBufIOCTL-tLenBufRecv;
       if(tLenBufRecv=SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
       // Содержимое пакета -> строку
       s := ""; for i := 3 to tLenBufRecv-3 do s := s+Chr(Buf[i]);
       // Парсинг полученной информации и упаковка ее в структуру
       ls := TStringList.Create;
       // Строку порезать на строки (разделитель ";")
       while Length(s)>0 do
         begin
          i := Pos(";",s);
          if i>0 then
            begin ls.Add(Trim(Copy(s,1,i-1))); Delete(s,1,i); end
          else
            begin ls.Add(s); s := ""; end;
         end;
         // Разбор списка строк, где нечетная содержит ключ, а четное - его значение
         if ls.IndexOf("ServerName")>-1 then
           begin
            // Создание нового дескриптора
            ServDef := NEW(PMSSQLServerDef);
            // Имя сервера
            if ls.Count>(ls.IndexOf("ServerName")+1) then
               ServDef.ServerName := ls[ls.IndexOf("ServerName")+1];
            // Установочный идентификатор
            if (ls.IndexOf("InstanceName")>-1) and
               (ls.Count>(ls.IndexOf("InstanceName")+1)) then
               ServDef.InstanceName := ls[ls.IndexOf("InstanceName")+1];
            // Флаг принадлежности к кластеру
            if (ls.IndexOf("IsClastered")>-1) and
               (ls.Count>(ls.IndexOf("IsClastered")+1)) then
               ServDef.IsClustered := not (ls[ls.IndexOf("IsClastered")+1]="No");
            // Версия сервера
            if (ls.IndexOf("Version")>-1) and
               (ls.Count>(ls.IndexOf("Version")+1)) then
              begin
               S := ls[ls.IndexOf("Version")+1];
               // Найти первую точку
               i := Pos(".",S);
               if i>0 then
                 begin
                  ServDef.Version.VersNum := Copy(S,1,i-1);
                  ServDef.Version.ModNum := Copy(S,i+1,Length(S)-i);
                 end
               else
                 begin
                  ServDef.Version.VersNum := S;
                  ServDef.Version.ModNum := "";
                 end;
              end;
            // Адрес коммуникационного порта
            if (ls.IndexOf("tcp")>-1) and
               (ls.Count>(ls.IndexOf("tcp")+1)) then
                ServDef.Port := StrToIntDef(ls[ls.IndexOf("tcp")+1],0);
            // Сетевой путь к серверу
            if (ls.IndexOf("np")>-1) and
               (ls.Count>(ls.IndexOf("np")+1)) then
                ServDef.Path := ls[ls.IndexOf("np")+1];
            SQLServerList.Add(ServDef);
           end;
      end;
   end;
 closeSocket(hSocket);
 WSACleanup;
end;

function SQLServ_GetServerDBList(SQLServer: PMSSQLServerDef; ListDB: TStrings): boolean;
// Создается объект TADOConnection с "пустой" БД (Initial Catalog)
// и User ID = "sa". Затем создается объект TADOQuery, привязывается к
// соединению и выполняющий зпрос к системной таблице sysdatabases
// Полученный НД сканируется и содержимое первого поля НД (имена Баз Данных)
// заполняет список ListDB
//  Возвращаемый результат содержит false, если соединение с указанным сервером
// не может быть установлено либо запрос не был выполнен нормально
begin
 result := true;
 ListDB.Clear;
 with TADODataSet.Create(nil) do
   try
     ConnectionString := "Provider=SQLOLEDB;Persist Security Info=false"+
                        ";User ID=sa;Data Source="+SQLServer.ServerName;
     CommandText := "use master select * from sysdatabases";
     try
       Open;
       while not EOF do
         begin ListDB.Add(Fields[0].AsString); Next; end;
       Close;
     except
      result := false;
     end;
   finally
     Free;
   end;
end;


 
Anatoly Podgoretsky ©   (2007-07-02 23:40) [3]

Если устроит родной диалог, то PromptDataSource, позволяет выбрать сервер и базу и настроить ConnectionString


 
Zik   (2007-07-03 10:52) [4]

Спасибо. Буду разбираться



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
2-1192870890
Sorry
2007-10-20 13:01
2007.11.11
Прорисовка SubItems в ТListView


15-1191966748
Petr V. Abramov
2007-10-10 01:52
2007.11.11
действительно сломалось все


15-1191414639
Elen
2007-10-03 16:30
2007.11.11
Несовместимость нового железа и старого софта.


8-1168924619
Kuzma
2007-01-16 08:16
2007.11.11
VST плагины и Delphi ...


2-1192991104
NiGGa
2007-10-21 22:25
2007.11.11
Delphi5 и константы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский