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

Вниз

Как вызвать окно выдора доступных MS SQL Server ов   Найти похожие ветки 

 
Int23   (2008-04-25 14:58) [0]

Есть прога в которой нужно указать имя скл сервера с которым будет установлено соединение. Как получить список доступных серверов?


 
Int23   (2008-04-25 15:07) [1]

Нашёл ответ тут http://www.delphipages.com/threads/thread.cfm?ID=165824&G=165815


 
Ega23 ©   (2008-04-25 15:17) [2]


> Есть прога в которой нужно указать имя скл сервера с которым
> будет установлено соединение. Как получить список доступных
> серверов?


Это всё крайне ненадёжно. Вот у меня сейчас реально установлен локальный MSDE. Я при установлении соединения, если жму поиск серверов - получаю ошибку (что-то с доменными правами связанное). С другой стороны, если я тупо ввожу имя инстанса - всё отлично работает.
Также что-то было связано с разделением DNS внутри подсети. Типа, по IP - нормально, а по имени - ерунда.
В общем, мой тебе совет - не заморачивайся с этим делом.


 
Stas ©   (2008-04-25 16:05) [3]

Microsoft в NativeClient для MSSQL 2005 отказалась от выпадающего списка серверов...


 
Ega23 ©   (2008-04-25 16:09) [4]


> Microsoft в NativeClient для MSSQL 2005 отказалась от выпадающего
> списка серверов...


наконец-то...


 
MsGuns ©   (2008-04-26 19:50) [5]

Как вариант:

type
 RSQLServerVersion = record
   VersNum: string;
   ModNum: string;
 end;
 // Дескриптор 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
//  Кажый пакет извлекается в буфер в виде строки, парсируется и информация
//  заполняет декскриптор TMSSQLServerDef, который добавляется в список,
//  адрес которого указан вх.параметром
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;



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

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

Наверх





Память: 0.49 MB
Время: 0.004 c
15-1221414047
cyborg
2008-09-14 21:40
2008.11.09
Уравнения Навье — Стокса


2-1222669916
vegarulez
2008-09-29 10:31
2008.11.09
вопрос про поток.


2-1222791159
электрослесарь
2008-09-30 20:12
2008.11.09
Неправильное удаление записи в БД


6-1194876467
Иван_А
2007-11-12 17:07
2008.11.09
Как вытащить номер сокета из clientaddr


15-1221592286
Городской Шаман
2008-09-16 23:11
2008.11.09
Вот Фленова ругаете, а у самих ошибка в статье.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский