![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выбрать сервер?
.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]
Ну так позволь формировать список доступных серверов и сделай диалог выбора.