Текущий архив: 2004.05.23;
Скачать: CL | DM;
ВнизРабота с MS SQL через OLE, ошибка подсоеденения Найти похожие ветки
← →
strelok-47 (2004-04-27 15:49) [0]Если кто в Дельфе (хотя и в билдере наверное тоже самое) пробовал подсоеденится с серверу то может сталкивался что пока когда вызываешь CreateOleObject и через IDispatch возвращенный этим вызовом коннектишься (вызываешь connect) к серверу, то потом при попытке законнектится к другому серверу вылетает что типа вы не можете законнектится к другому серверу, пока вы не законнекчены на этом серваке (you cannot change name? login бла_бла for server object while it is connected). Попытался объявить массив OLEVariant"ов, но это не помогло, ошибка та же. кто нить ка нить это побеждал?
← →
Курдль © (2004-04-27 15:59) [1]Ничего, кроме OLEDB в голову не приходит...
← →
strelok-47 (2004-04-27 16:20) [2]Я не совсем верно выразился, не к серверу я конечно коннекчусь а создаю объект с помощью CreateOleObject("SQLDMO.SQLServer"), а уж через него к серверу делаю коннект
← →
Курдль © (2004-04-27 16:23) [3]
> создаю объект с помощью CreateOleObject("SQLDMO.SQLServer"),
> а уж через него к серверу делаю коннект
А так надо? Проще никак?
← →
sniknik © (2004-04-27 16:24) [4]> you cannot change name? login бла_бла for server object while it is connected
патаешся свойства конекта без рассоеденения поменять? а чего ожидал?
зачем побеждать, нормальное поведение, коней на переправе не меняют.
> Я не совсем верно выразился ...
точно. и сейчас не понятно.
← →
strelok-47 (2004-04-27 16:33) [5]Ну раз не понятно.
var SQLServer : Olevariant;
dmo : Olevariant;
SQLServer:=CreateOleObject("SQLDMO.SQLServer");
dmo:=SQLServer.Application;
dmo:=dmo.ListAvailableSQLServers;
if dmo.Count > 1 then begin
for i:= 1 to dmo.Count do begin
tvDatabases.Items.Add(nil, AnsiUpperCase(dmo.Item(i)));
end; //типа лепим список серверов доступных.
ниже пытаемся залогинится к какому-нить выбранному
dmo := SQLServer;
dmo.LoginSecure := false;
dmo.Name:=tvDatabases.Selected.Text;
dmo.login := UserName;
dmo.password := Password;
dmo.Connect;
dmo := SQLServer.databases;
CurNode := tvDatabases.Items.Item[tvDatabases.Selected.Index];
with tvDatabases.Items do begin
CurNode := AddChild(CurNode, "Databases");
for i:=1 to dmo.count do begin
dmo := dmo.Item(i);
AddChild(CurNode, AnsiUpperCase(dmo.name));
dmo := SQLServer.databases;
end
end;
первый коннект проходит нормально, при попытке законнектится к другому серевру вылазит ошибка, видимо невозможно держать открытым коннект к разным серверам, придется создавать либо кучу объктов, для кадого сервера свой (не уверен что жто возможно), либо при попытке соеденения с другим сервером закрывать текущий коннект
← →
sniknik © (2004-04-27 16:49) [6]не вижу где DisConnect вызывается? обязательно нужно, лутше в блоке try finally чтобы наверняка.
> придется создавать либо кучу объктов
не волнуйся они так и так создадутся, раз соннект создан, вопрос в том будет ли у тебя на них указатеть или он "потеряется".
← →
strelok-47 (2004-04-27 16:56) [7]>не вижу где DisConnect вызывается? обязательно нужно, лутше в блоке try finally чтобы наверняка.
а его и нету. Жаль конешно что несколько коннектов не удеражать, я потому и написал, может кто решал что-то подобное. А так придется логин, пароль хранить
← →
sniknik © (2004-04-27 17:14) [8]> Жаль конешно что несколько коннектов не удеражать
SQLServer1:= CreateOleObject("SQLDMO.SQLServer");
SQLServer2:= CreateOleObject("SQLDMO.SQLServer");
...
← →
strelok-47 (2004-04-27 17:27) [9]Вряд ли это поможет. сколько раз вызывать CreateOleObject? от 1 до... скольки?
← →
sniknik © (2004-04-27 17:40) [10]а сколько у тебя серверов с mssql в сети? пара? пара сотен? тысячь? не волнуйся понапрасну выдержит.
← →
sniknik © (2004-04-27 17:48) [11]а понял, наверное беспокоишся насчет того что куча обьектов насоздается, нет создастся только один дальше будет только RefCount увеличиватся, как у любого нормального COM обьекта.
← →
sniknik © (2004-04-27 17:53) [12]да еще, так понимаю пишеш и пробуеш на машине с установленным mssql? поэтому все более менее "шоколадно", попробуй на машине без него, работать просто не будет, DMO в винды по умолчанию не ставится, надо предусматривать установку (аналогично как с BDE).
← →
strelok-47 (2004-04-27 17:56) [13]щас переделал вот так
SQLServer:=CreateOleObject("SQLDMO.SQLServer");
dmo:=CreateOleObject("SQLDMO.SQLServer");
dmo:=SQLServer.Application;
dmo:=dmo.ListAvailableSQLServers;
if dmo.Count > 1 then begin
for i:= 1 to dmo.Count do begin
SQLServerN:=CreateOleObject("SQLDMO.SQLServer");
PSQLServerN := @SQLServerN;
tvDatabases.Items.AddObject(nil, AnsiUpperCase(dmo.Item(i)), PSQLServerN); где SQLServerN OleVariant а PSQLServerN POleVariant, список серверов создается
а вот при коннекте код такой
var
dmo : OleVariant;
pdmo : POleVariant;
pdmo := tvDatabases.Items.Item[tvDatabases.Selected.Index].Data;
dmo := pdmo^; - и во тут ошибка Invalid type cast
← →
sniknik © (2004-04-27 18:18) [14]for i:= 1 to dmo.Count do begin
SQLServerN:=CreateOleObject("SQLDMO.SQLServer");
PSQLServerN := @SQLServerN;
tvDatabases.Items.AddObject(nil, AnsiUpperCase(dmo.Item(i)), PSQLServerN);
????
сохраняеш адрес на переменную и тутже перетираеш то на что он указывает. сохранится только последний, и то если переменная не локальная, остальные указывают в никуда (последний под вопросом).
если не считать этого то
dmo := Variant(pdmo^); - панацея.
← →
strelok-47 (2004-04-28 15:58) [15]нет, я там просто два end"а не указал. полностью там так
if dmo.Count > 1 then begin
for i:= 1 to dmo.Count do begin
...
end
end
попробовал dmo := Variant(pdmo^); пишет invalid variant operation на это строчке
← →
sniknik © (2004-04-28 18:34) [16]> invalid variant operation
а ты попробуй до того как туда всякая фигня записалась. (перечитай [14] еще раз).
для пробы попробуй конвертить сразу после записи (прям следующей строкой пока еще все нормально).
Страницы: 1 вся ветка
Текущий архив: 2004.05.23;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.035 c