Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выбрать сервер?


.alex ©   (2003-08-03 17:14:00) 

У меня есть клиент, который работает с MS SQL Server. Вопрос: Как мне сделать диалог выбора сервера из списка возможных, для того чтобы программно сделать ConnectionString.


sniknik   (2003-08-04 14:26:00) [1]

.alex (04.08.03 14:12)
а какой мусор?

у меня правильно выдало, правда только 4 сервера из 13-ти, (т.е. только в одной подсети), и кстати по моему эта dll является частью SQLDMO (т.е. без него тоже работать не будет).

попробуй лутше оригинал
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
( E.Message)

.alex (04.08.03 14:12)
а какой мусор?

у меня правильно выдало, правда только 4 сервера из 13-ти, (т.е. только в одной подсети), и кстати по моему эта dll является частью SQLDMO (т.е. без него тоже работать не будет).

попробуй лутше оригинал
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;


.alex   (2003-08-04 14:12:00) [2]

2NAlexey: что-то твоя функция какой-то мусор выдаёт, почему?


NAlexey   (2003-08-04 10:55:00) [3]

Ну если быть точным то так...

function dbserverenum(SearchMode: word; servnamebuf: PChar;
sizeservnamebuf:word; numentries: pword): Integer; cdecl; external "ntwdblib.dll";

procedure TForm1.Button1Click(Sender: TObject);
const
MAXBUFENUMSIZE =1024;
LOC_SEARCH =1;
NET_SEARCH =2;
ENUM_SUCCESS =$0;
var
Buf : array[0..MAXBUFENUMSIZE - 1] of char;
N: word;
Res: Integer;
S: String;
I, ActualEnum: Integer;
begin
Res := dbserverenum(LOC_SEARCH or NET_SEARCH, Buf, MAXBUFENUMSIZE, @N);
if Res = ENUM_SUCCESS then
begin
S := "";
ActualEnum := 0;
for I := 0 to MAXBUFENUMSIZE - 1 do
begin
if Buf[I] <> #0
then
S := S + buf[I]
else begin
Memo1.Lines.Add(S);
( ActualEnum)

Ну если быть точным то так...

function dbserverenum(SearchMode: word; servnamebuf: PChar;
sizeservnamebuf:word; numentries: pword): Integer; cdecl; external "ntwdblib.dll";

procedure TForm1.Button1Click(Sender: TObject);
const
MAXBUFENUMSIZE =1024;
LOC_SEARCH =1;
NET_SEARCH =2;
ENUM_SUCCESS =$0;
var
Buf : array[0..MAXBUFENUMSIZE - 1] of char;
N: word;
Res: Integer;
S: String;
I, ActualEnum: Integer;
begin
Res := dbserverenum(LOC_SEARCH or NET_SEARCH, Buf, MAXBUFENUMSIZE, @N);
if Res = ENUM_SUCCESS then
begin
S := "";
ActualEnum := 0;
for I := 0 to MAXBUFENUMSIZE - 1 do
begin
if Buf[I] <> #0
then
S := S + buf[I]
else begin
Memo1.Lines.Add(S);
Inc(ActualEnum);
if ActualEnum = N then
break;
S := "";
end;
end;
end;
end;


NAlexey   (2003-08-04 10:49:00) [4]

Можно так...

var
Buf : array[0..MAXBUFENUMSIZE - 1] of char;
N: word;
Res: Integer;
S: String;
I, ActualEnum: Integer;
begin
Res := dbserverenum(LOC_SEARCH or NET_SEARCH, Buf, MAXBUFENUMSIZE, @N);
if Res = ENUM_SUCCESS then
begin
S := "";
ActualEnum := 0;
for I := 0 to MAXBUFENUMSIZE - 1 do
begin
if Buf[I] <> #0
then
S := S + buf[I]
else begin
List.Add(S);
( ActualEnum)

Можно так...

var
Buf : array[0..MAXBUFENUMSIZE - 1] of char;
N: word;
Res: Integer;
S: String;
I, ActualEnum: Integer;
begin
Res := dbserverenum(LOC_SEARCH or NET_SEARCH, Buf, MAXBUFENUMSIZE, @N);
if Res = ENUM_SUCCESS then
begin
S := "";
ActualEnum := 0;
for I := 0 to MAXBUFENUMSIZE - 1 do
begin
if Buf[I] <> #0
then
S := S + buf[I]
else begin
List.Add(S);
Inc(ActualEnum);
if ActualEnum = N then
break;
S := "";
end;
end;
end;
end;


sniknik   (2003-08-04 01:30:00) [5]

штатных средств нет (если имеете ввиду компонент штоб ложить на форму)
можеш сканировать сеть на открытие порта в TCP/IP "default port is 1433". с определенной долей вероятности SQL server на машине с открытым портом будет стоять. (могли поменять порт/убрать протоком и т.д.)

или можеш устанавливать на машине с программой SQLDMO которое примерно этим и занимается. обращайся к его методам.

хотя может ты пытаешся сделать то что уже есть в симтеме, имею ввиду PromptDataSource (кстати тоже при неустановленом SQLDMO сервера не показывает).


.alex   (2003-08-03 23:16:00) [6]

Хотелось бы конечно "автоматом", ну если никто не скажет, буду делать делать "в лоб"...


Dred2k   (2003-08-03 21:10:00) [7]

Ты в автомате хочешь?
Тогда сканируй ip-сеть по портам, которые предназначены в MS SQL для определения наличия сервера. Если есть более красивые варианты (сейчас тебе и мне о них расскажут), то воспользуйся этими штатными (?) средствами.
Или просто дай юзеру возможность "добавить", "удалить", "отредактировать", "выбрать" сервер (его полное описание, разумеется).


.alex   (2003-08-03 20:52:00) [8]

Т.е нужно использовать WNetХХХ функции, для получения списка северов?


Dred2k   (2003-08-03 17:50:00) [9]

Ну так позволь формировать список доступных серверов и сделай диалог выбора.


Наверх

Титульная страница Поиск, карта сайта Написать письмо