![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с MS SQL через OLE, ошибка подсоеденения [D6, MSSQL]
strelok-47 © (2004-04-27 15:49:00)Если кто в Дельфе (хотя и в билдере наверное тоже самое) пробовал подсоеденится с серверу то может сталкивался что пока когда вызываешь CreateOleObject и через IDispatch возвращенный этим вызовом коннектишься (вызываешь connect) к серверу, то потом при попытке законнектится к другому серверу вылетает что типа вы не можете законнектится к другому серверу, пока вы не законнекчены на этом серваке (you cannot change name? login бла_бла for server object while it is connected). Попытался объявить массив OLEVariant'ов, но это не помогло, ошибка та же. кто нить ка нить это побеждал?
sniknik (2004-04-28 18:34:00) [1]> invalid variant operation
а ты попробуй дотого как туда всякая фигня записалась. (перечитай [14] еще раз).
для пробы попробуй конвертить сразупосле записи (прям следующей строкой пока еще все нормально).
strelok-47 (2004-04-28 15:58:00) [2]нет, я там просто два 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-27 18:18:00) [3]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-27 17:56:00) [4]щас переделал вот так
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 17:53:00) [5]да еще, так понимаю пишеш и пробуеш на машине с установленным mssql? поэтому все более менее "шоколадно", попробуй на машине без него, работать просто не будет, DMO в винды по умолчанию не ставится, надо предусматривать установку (аналогично как с BDE).
sniknik (2004-04-27 17:48:00) [6]а понял, наверное беспокоишся насчет того что куча обьектов насоздается, нет создастся только один дальше будет только RefCount увеличиватся, как у любого нормального COM обьекта.
sniknik (2004-04-27 17:40:00) [7]а сколько у тебя серверов с mssql в сети? пара? пара сотен? тысячь? не волнуйся понапрасну выдержит.
strelok-47 (2004-04-27 17:27:00) [8]Вряд ли это поможет. сколько раз вызывать CreateOleObject? от 1 до... скольки?
sniknik (2004-04-27 17:14:00) [9]> Жаль конешно что несколько коннектов не удеражать
SQLServer1:= CreateOleObject('SQLDMO.SQLServer');
SQLServer2:= CreateOleObject('SQLDMO.SQLServer');
...
strelok-47 (2004-04-27 16:56:00) [10]>не вижу где DisConnect вызывается? обязательно нужно, лутше в блоке try finally чтобы наверняка.
а его и нету. Жаль конешно что несколько коннектов не удеражать, я потому и написал, может кто решал что-то подобное. А так придется логин, пароль хранить
sniknik (2004-04-27 16:49:00) [11]не вижу где DisConnect вызывается? обязательно нужно, лутше в блоке try finally чтобы наверняка.
> придется создавать либо кучу объктов
не волнуйся они так и так создадутся, раз соннект создан, вопрос в том будет ли у тебя на них указатеть или он "потеряется".
strelok-47 (2004-04-27 16:33:00) [12]Ну раз не понятно.
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:24:00) [13]> you cannot change name? login бла_бла for server object while it is connected
патаешся свойства конекта без рассоеденения поменять? а чего ожидал?
зачем побеждать, нормальное поведение, коней на переправе не меняют.
> Я не совсем верно выразился ...
точно. и сейчас не понятно.
Курдль (2004-04-27 16:23:00) [14]
> создаю объект с помощью CreateOleObject('SQLDMO.SQLServer'),
> а уж через него к серверу делаю коннект
А так надо? Проще никак?
strelok-47 (2004-04-27 16:20:00) [15]Я не совсем верно выразился, не к серверу я конечно коннекчусь а создаю объект с помощью CreateOleObject('SQLDMO.SQLServer'), а уж через него к серверу делаю коннект
Курдль (2004-04-27 15:59:00) [16]Ничего, кроме OLEDB в голову не приходит...