Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.027 c
9-1074018567
falc0n
2004-01-13 21:29
2004.05.23
2D в Direct3D8


1-1083830145
Iraizor
2004-05-06 11:55
2004.05.23
TRichEdit , склейка разноцветных строк.


1-1084292270
Vitello
2004-05-11 20:17
2004.05.23
Работа в графическом режиме?????????????


3-1082873201
DeaDer
2004-04-25 10:06
2004.05.23
ComboBox со значениями из базы


1-1083938188
united
2004-05-07 17:56
2004.05.23
MessageDlg по-русски - как?