Форум: "Базы";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];
ВнизКак выбрать сервер? Найти похожие ветки
← →
.alex (2003-08-03 17:14) [0]У меня есть клиент, который работает с MS SQL Server. Вопрос: Как мне сделать диалог выбора сервера из списка возможных, для того чтобы программно сделать ConnectionString.
← →
Dred2k (2003-08-03 17:50) [1]Ну так позволь формировать список доступных серверов и сделай диалог выбора.
← →
.alex (2003-08-03 20:52) [2]Т.е нужно использовать WNetХХХ функции, для получения списка северов?
← →
Dred2k (2003-08-03 21:10) [3]Ты в автомате хочешь?
Тогда сканируй ip-сеть по портам, которые предназначены в MS SQL для определения наличия сервера. Если есть более красивые варианты (сейчас тебе и мне о них расскажут), то воспользуйся этими штатными (?) средствами.
Или просто дай юзеру возможность "добавить", "удалить", "отредактировать", "выбрать" сервер (его полное описание, разумеется).
← →
.alex (2003-08-03 23:16) [4]Хотелось бы конечно "автоматом", ну если никто не скажет, буду делать делать "в лоб"...
← →
sniknik (2003-08-04 01:30) [5]штатных средств нет (если имеете ввиду компонент штоб ложить на форму)
можеш сканировать сеть на открытие порта в TCP/IP "default port is 1433". с определенной долей вероятности SQL server на машине с открытым портом будет стоять. (могли поменять порт/убрать протоком и т.д.)
или можеш устанавливать на машине с программой SQLDMO которое примерно этим и занимается. обращайся к его методам.
хотя может ты пытаешся сделать то что уже есть в симтеме, имею ввиду PromptDataSource (кстати тоже при неустановленом SQLDMO сервера не показывает).
← →
NAlexey (2003-08-04 10:49) [6]Можно так...
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;
← →
NAlexey (2003-08-04 10:55) [7]Ну если быть точным то так...
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;
← →
.alex (2003-08-04 14:12) [8]2NAlexey: что-то твоя функция какой-то мусор выдаёт, почему?
← →
sniknik (2003-08-04 14:26) [9].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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c