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

Вниз

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

 
Ромн   (2003-01-20 17:15) [0]

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

Огромное спасибо.


 
Reindeer Moss Eater   (2003-01-20 17:20) [1]

Получи список серверов из списка зарегистрированных серверов в клиентском ПО MSSQL


 
Ромн   (2003-01-20 17:25) [2]

Я не точно выразился , как мне это полуть в во время выполнения приложения ?


 
Reindeer Moss Eater   (2003-01-20 17:26) [3]

Ответ прежний


 
Ромн   (2003-01-20 17:43) [4]

Если можно , чуть-чуть более развернутей ?


 
Reindeer Moss Eater   (2003-01-20 17:45) [5]

HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\Client\ConnectTo


 
Ромн   (2003-01-20 17:51) [6]

Спасибо !!!


 
Ромн   (2003-01-20 18:01) [7]

Хорошо, а как оттуда выдрать список баз ?


 
sniknik   (2003-01-20 18:02) [8]

похоже вы о разных вещах говорите

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;

{2 метода один закомментарен}
function TDMod.GetSQLDatabases(ServerName: String; BasesItems: TStrings): boolean;
{
//получение баз через ADO
var DBName: string;
begin
ADOConnection1.OpenSchema(siCatalogs, EmptyParam, EmptyParam, ADODataSet1);
while not ADODataSet1.Eof do
begin
DBName := ADODataSet1["CATALOG_NAME"];
MessageBox(0, PChar(DBName), "Warning", MB_OK);
ADODataSet1.Next;
end;
end;
}
begin
result:= false;
try
ADOConnection1.Close;
ADOConnection1.ConnectionString:= "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source="+ServerName;
ADODataSet1.CommandText:= "EXEC sp_databases";
ADODataSet1.Open;
while not ADODataSet1.Eof do begin
BasesItems.Add(ADODataSet1.FieldByName("DATABASE_NAME").AsString);
ADODataSet1.Next;
end;
ADOConnection1.Close;
result:= true;
except
on E: Exception do DoIfError(E.Message);
end;
end;


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


 
asmith   (2003-01-20 18:07) [9]

С помощью 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.


 
Reindeer Moss Eater   (2003-01-20 18:09) [10]

список найденных в сети MSSQL-серверов
Точно найденных?


 
asmith   (2003-01-20 18:20) [11]

MSDN:
The ListAvailableSQLServers method returns a NameList object that enumerates network-visible instances of Microsoft® SQL Server™ 2000.



 
Reindeer Moss Eater   (2003-01-20 18:22) [12]

Если у меня в MSSQL клиенте один и тот же физический сервер зарегистрирован под десятью именами, сколько серверов "найдет" SQLDMO?
Подозреваю, что все 10 штук и "найдет". И "искать" он будет не в сети, а в реестре.


 
Reindeer Moss Eater   (2003-01-20 18:26) [13]

А если он найдет один физический, а в клиенте он зарегистрирован дважды (один для MultiProtocol, второй для TCP/IP ) как поможет мне найденной имя (одно) работать именно по TCP/IP?


 
asmith   (2003-01-20 18:44) [14]

К регистрации серверов на клиенте это не имеет никакого отношения. Кстати, при выполнении занимает ощутимое время - в реестре можно уже было найти много раз.


 
Reindeer Moss Eater   (2003-01-20 19:02) [15]

Да я собственно не против того, что он ищет. Я про другое.
При настройке клиента MSSQL я задаю некие желаемые для себя параметры. Все они запоминаются в созданном псевдониме (Client Network Utility)
Имя псевдонима - это мой SERVER NAME (для работы через BDE например).
Указывая различные имена псевдонимов, зарегистрированных в клиенте, я могу влиять на используемый протокол, шифрование трафика, порт сервера и т.д.
Вопрос: Если SQLDMO не смотрит в реестр, а возвращает NetBios-имя физического сервера (или что оно мне возвратит?) то какая мне от этого имени практическая польза?
Кстати, при выполнении занимает ощутимое время
Думаю он получив список из реестра, пробует каждый псевдоним на коннект


 
asmith   (2003-01-20 19:14) [16]

У меня зарегистрировано всего 5 серверов, SQLDMO возвращает в два раза больше имен, в том числе и из других доменов, так что нет сомнений, что не читает из реестра. И не пробует на коннект, ибо некоторые сервера остановлены, но в список попадают. А польза от этого есть, особенно в больших сетках с большим количеством клиентов и несколькими серверами. Другое дело, что Client Network Utility дает возможности задать много больше, но все же это лучше, чем ничего.


 
Reindeer Moss Eater   (2003-01-20 19:18) [17]

Не пробовал SQLDMO. Допускаю, что даже без зарегистрированных в клиенте псевдонимов им найдутся сервера. В той же сети что и клиент! А если сервер реально доступен, но находится в другой сети? Как стали бы вы его искать на месте SQLDMO?


 
sniknik   (2003-01-20 19:30) [18]

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

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;


а насчет поиска, у нас 3 подсети в одной, и ничего находит везде. процедура что я первой ложил - GetSQLServers, даже на тех машинах что в домен не входят, а вот по указанному адресу в реестре я только себя и нашол, (я как раз в домен не вхожу, чаще всего).


 
Reindeer Moss Eater   (2003-01-20 19:35) [19]

Ладно, проверю сам, и не на подсетях, а на разных сетях.
Тогда еще последний на сегодня вопрос:
Сказало мне SQLDMO что есть такой сервер по имени "AnotherServer" (в клиенте он у меня не зарегистрирован)
Приложение мое (допустим) требует что бы работа шла через мультипротокол с криптованием трафика. Как мне использовать полученное имя "AnotherServer" чтобы удовлетворить желание приложения?


 
asmith   (2003-01-20 19:59) [20]

Полагаю, что это просто невозможно - узнать с помощью этого дела некую специфику конкретного клиентского соединения.


 
Reindeer Moss Eater   (2003-01-20 20:01) [21]

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


 
Opuhshii   (2003-01-21 08:49) [22]

можно используя NetServerEnum c servertype = SV_TYPE_SQLSERVER


 
Opuhshii   (2003-01-21 08:52) [23]

это для получения SQL серверов,... ;)


 
Reindeer Moss Eater   (2003-01-21 09:32) [24]

Результаты проверки кода, приведенного sniknik © (20.01.03 18:02) (GetSQLServers)

Исходные данные:
- Две сети класса "С", правильно настроена и работает маршрутизация, сетевых экранов нет.
- Контроллеров доменов нет, все хосты "одиноко стоящие"
- В первой сети есть установленные, но нет запущенных SQL серверов. В этой же сети мой компьютер с тестовой программой
- Во второй сети есть установленный и запущенный SQL сервер.
- В клиенте MSSQL (на моей машине в первой сети) зарегистрированы все сервера из обоих сетей + сервера, доступ к которым возможен только по dialup
(нет соединения на момент проверки)

Результаты:
- GetSQLServers показала все зарегистрированные в клиенте псевдонимы.
- После удаления псевдонима работающего во второй сети сервера GetSQLServers не находит этот сервер
- После запуска в первой сети сервера и удаления его псевдонима GetSQLServers не находит этот сервер


 
Ромн   (2003-01-21 09:58) [25]

При использовании кода sniknik выскакивает ошибка при создании объекта "SQLDMO.application" :
"Variant does not reference an automation object"

Подскажите , что не верно сделал ?


 
Reindeer Moss Eater   (2003-01-21 10:04) [26]

невнимательно прочитал его пост


 
Ромн   (2003-01-21 10:12) [27]

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


 
Севостьянов Игорь   (2003-01-22 13:42) [28]

Кстати можно использовать UDP


 
Reindeer Moss Eater   (2003-01-22 13:43) [29]

Можно. А если сервер в другой сети?



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

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

Наверх





Память: 0.51 MB
Время: 0.009 c
14-15883
Youri
2003-01-20 11:29
2003.02.06
TAPI


6-15799
Stimo
2002-12-10 21:47
2003.02.06
TServerSocket TClientSocket отсутствуют в Delphi 7


14-15816
Ginzzz
2003-01-18 15:07
2003.02.06
Что такое динамические диски ?


1-15559
SergeN
2003-01-28 16:08
2003.02.06
Графика


14-15927
Дремучий
2003-01-20 23:46
2003.02.06
Посоветуйте http-сайт-менеджера.





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