Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.034 c
4-1081405299
alex732
2004-04-08 10:21
2004.05.23
WM_COPYDATA


7-1081264318
alan2
2004-04-06 19:11
2004.05.23
Как в Дэлфи изменить настройки биоса под ХР виндой?


4-1081318448
DennisLNC
2004-04-07 10:14
2004.05.23
Mutex


14-1083666223
StudentOn
2004-05-04 14:23
2004.05.23
Apache со стороны Delphi


1-1083818215
тихий вовочка
2004-05-06 08:36
2004.05.23
Работа с TMemoryStream





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский