Як отримати список імен доступних серверів і список баз даних

Як отримати список імен доступних серверів і список баз даних

Субж.
Тобто, є кілька mssql серверів, на них живуть по кілька баз, як мені отримати спочатку імена цих серверів, а потім відповідно імена баз. Все це потрібно звичайно щоб скласти рядок підключення для ado.

Отримай список серверів зі списку зареєстрованих серверів в клієнтському ПО MSSQL

Я не точно висловився. як мені це Напівтім в під час виконання програми?

Якщо можна. трохи більш розгорнуто?

Добре, а як звідти видерти список баз?

схоже ви про різні речі говорите

function TDMod.GetSQLServers (ServersItems: TStrings): boolean;
var NameList, Application: OleVariant;
i: Integer;
begin
result: = false;
try
try
Application: = CreateOleObject ( "SQLDMO.Application");
NameList: = Application.ListAvailableSQLServers;
For i: = 1 to NameList.Count do
ServersItems.Add (NameList.Item (i));
result: = true;
except
on E: Exception do DoIfError (E.Message);
end;
finally
NameList: = Unassigned;
Application: = Unassigned;
end;
end;

але можливо тобі просто потрібна одна з фенкцій
EditConnectionString (ADOConnection) // модуль AdoConed
PromptDataSource (Handle, ComboBox1.Text) // модуль ADODB

За допомогою SQLDMO:
var
FDMOApplication. Variant;
Names. Variant;
i. integer;
begin
try
FDMOApplication: = CreateOleObject ( "SQLDMO.Application");
Names: = FDMOApplication.ListAvailableSQLServers;
for i: = 1 to Names.Count do
lbServers.Items.Add (Names.Item (i));
finally
FDMOApplication: = Null;
end;
end;
Тут в combo box lbServers додається список знайдених в мережі MSSQL-серверів. Необхідна умова - інстальований клієнт MSSQL.

список знайдених в мережі MSSQL-серверів
Точно знайдених?

Якщо у мене в MSSQL клієнта один і той же фізичний сервер зареєстровано за десятьма іменами, скільки серверів "знайде" SQLDMO?
Підозрюю, що всі 10 штук і "знайде". І "шукати" він буде не в мережі, а в реєстрі.

А якщо він знайде один фізичний, а в клієнті він зареєстрований двічі (один для MultiProtocol, другий для TCP / IP) як допоможе мені знайденої ім'я (одне) працювати саме по TCP / IP?

До реєстрації серверів на клієнті це не має ніякого відношення. До речі, при виконанні займає відчутний час - в реєстрі можна вже було знайти багато разів.

Так я, власне, не проти того, що він шукає. Я про інше.
Під час налаштування клієнта MSSQL я задаю якісь бажані для себе параметри. Всі вони запам'ятовуються в створеному псевдонім (Client Network Utility)
Ім'я псевдоніма - це мій SERVER NAME (для роботи через BDE наприклад).
Вказуючи різні імена псевдонімів, зареєстрованих в клієнті, я можу впливати на використовуваний протокол, шифрування трафіку, порт сервера і т.д.
Питання: Якщо SQLDMO не дивиться в реєстр, а повертає NetBios-ім'я фізичної сервера (або що воно мені поверне?) То яка мені від цього імені практична користь?
До речі, при виконанні займає відчутний час
Думаю він отримавши список з реєстру, пробує кожен псевдонім на коннект

У мене було всього 5 серверів, SQLDMO повертає в два рази більше імен, в тому числі і з інших доменів, так що немає сумнівів, що не читає з реєстру. І не намагається на коннект, бо деякі сервера зупинені, але в список потрапляють. А користь від цього є, особливо в великих сітках з великою кількістю клієнтів і декількома серверами. Інша справа, що Client Network Utility дає можливості поставити багато більше, але все ж це краще, ніж нічого.

Чи не пробував SQLDMO. Допускаю, що навіть без зареєстрованих в клієнті псевдонімів їм знайдуться сервера. У тій же мережі що і клієнт! А якщо сервер реально доступний, але знаходиться в іншій мережі? Як стали б ви його шукати на місці SQLDMO?

можна і зареєстровані за групами

oApp: = CreateOleObject ( "SQLDMO.Application");
for i: = 1 to oApp.ServerGroups.Count do
begin
for j: = 1 to oApp.ServerGroups.item (i) .RegisteredServers.Count do
Memo1.Lines.Add ((oApp.ServerGroups.item (i) .RegisteredServers.Item (j) .Name));
end;
oApp: = Unassigned;

Гаразд, перевірю сам, і не на подсетях, а на різних мережах.
Тоді ще останній на сьогодні питання:
Сказало мені SQLDMO що є такий сервер на ім'я "AnotherServer" (в клієнті він у мене не зареєстрований)
Додаток моє (припустимо) вимагає що б робота йшла через мультіпротокол з криптуванням трафіку. Як мені використовувати отримане ім'я "AnotherServer" щоб задовольнити бажання програми?

Вважаю, що це просто неможливо - дізнатися за допомогою цієї справи якусь специфіку конкретного клієнтського з'єднання.

Та не специфіку додатка треба дізнатися. А змусити клієнтську частину MSSQL працювати так, як хочеться мені (використовуючи тільки ім'я повернене SQLDMO)

можна використовуючи NetServerEnum c servertype = SV_TYPE_SQLSERVER

це для отримання SQL серверів. ;)

Початкові дані:
- Дві мережі класу "С", має бути встановлена ​​і працює маршрутизація, мережевих екранів немає.
- Контролерів доменів немає, все хости "самотньо стоять"
- У першій мережі є встановлені, але немає запущених SQL серверів. У цій же мережі мій комп'ютер з тестової програмою
- У другій мережі є встановлений і запущений SQL сервер.
- В клієнті MSSQL (на моїй машині в першій мережі) зареєстровані всі сервера з обох мереж + сервера, доступ до яких можливий тільки за dialup
(Немає з'єднання на момент перевірки)

результати:
- GetSQLServers показала всі зареєстровані в клієнті псевдоніми.
- Після видалення псевдоніма працює в другій мережі сервера GetSQLServers не знаходить цей сервер
- Після запуску в першій мережі сервера і видалення його псевдоніма GetSQLServers не знаходить цей сервер

При використанні коду sniknik вискакує помилка при створенні об'єкта "SQLDMO.application".
"Variant does not reference an automation object"

Підкажіть. що не вірно зробив?

неуважно прочитав його пост

) Я один до одного вставив. Клієнт варто. На першому рядку
вискакує Application: = CreateOleObject ( "SQLDMO.Application");

До речі можна використовувати UDP

Можна, можливо. А якщо сервер в іншій мережі?

Схожі статті