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

Вниз

Проблема с IBQuery и DLL   Найти похожие ветки 

 
yaric   (2003-01-10 17:55) [0]

Объясняю проблему
из библиотеки вызывается форма на которой лежит
IBQuery. При вызове метода Open возникает ошибка
EIBInterbaseError c кодом 512 и говорит что
Cursor already exist

Помогите пожалуйста что делать


 
yaric   (2003-01-11 13:21) [1]

Ну кто нибудь помогите очень надо...


 
Alexandr   (2003-01-11 13:41) [2]

в dll надо DataBase свой класть, тогда проще


 
yaric   (2003-01-11 13:49) [3]

Так вот вчем загвоздка если количество соединений к серверу ограничено ну например 5 и пусть у меня 10 dll в которых лежит IBDatabase и вдруг все они используются то бок вылетит ошибка
о том что мы превысили допустимо возможный минимум. Поэтому я и
передаю IBDatabase как параметр в функцию которую импортирую из библиотеки


 
Alexandr   (2003-01-11 13:58) [4]

1) ну тут в конце концов дело может быть не в объекте DataBase, а в хэндле коннекта, т.е. даже несколько database могут через один хэндл работать - т.е. одним подключиться, а остальным готовый хэндл передать.
2) Firebird не имеет ограничения на коннекты. Поэтому это как бы не принципиально.
3) Я в этом ( dll+database), сразу говорю, не силен.
4) попробуй поищи по FIBPlus, мож оно аналогично и на IBX пойдет
www.fibplus.net
www.fibplus.com.ua
а мож и сам на fibplus перейдешь...


 
yaric   (2003-01-11 16:38) [5]

Попробую передать хэндл соединения


 
yaric   (2003-01-11 16:48) [6]

Кстати а как это сделать я еще не разу с хэндлами не работал


 
Alexandr   (2003-01-12 09:10) [7]

по-моему DataBase.handle


 
yaric   (2003-01-12 13:56) [8]

Да но это свойство только для чтения каким образом с ним работать


 
Alexandr   (2003-01-12 14:01) [9]

вот код для присвоения коннекта от TdataBase к TpFIBDataBase.
Т.е. потом они оба через один коннект работают.

FIBDB.Close;
FibDB.DBName:="Cloned";
DBTables.Check(DbiGetProp(HDBIOBJ(DataModule2.DB.Handle),
dbNATIVEHNDL, @h, sizeof(tisc_db_handle), l));
FibDB.Handle:=h;
Firms.Open;

видно, что в FIBPlus по крайней мере в хэндл можно записать. А уж как там в этом IBX - х.з.


 
Alexandr   (2003-01-12 14:18) [10]

да, вот еще нашел
------------------------------------------------
> Как лучше организовать подключение форм - полюгинов(dll) к ib.
>
Лучше все-таки не dll, а bpl. Ну, просто меньше проблем. С пакетами примерно
так

function LoadComponentFromPackage(PackageName,aClassName:string;
aOwner: TComponent): TComponent;
begin
result:=nil;
if LoadPackage(PackageName) = 0 then
raise Exception.Create(Format(sLoadPkgError,[PackageName]));
result:=TComponentClass(FindClass(aClassName)).Create(aOwner);
end;

Дальше в программе использовать кастинг, и функции RTTI: GetPropValue,
SetPropValue etc (в хелпах нету, смотри TypInfo.pas)
ну, а в самом пакете в initialization не забыть зарегистрировать класс, а в
finalization разрегистрировать:

initialization
RegisterClass(TMyForm);
finalization
unRegisterClass(TMyForm);
------------------------------------------------------------



 
Alexandr   (2003-01-12 14:21) [11]

а вот еще. Как раз твоя проблема.
Это глюк в IBX.
вот вопрос был
----------------------------------------------------
Проблема с передачей коннекта в DLL.

Имеем: BD5 IB5.6 IBX 5.04
Чтобы в DLL повторно не коннектиться к IB из EXE передаю IBDatabase.Handle.
В DLL делаю IBDatabase.SetHandle для полученного значения. При открытии
IBTable получаю сообщение
Dynamic SQL Error.
SQL error code = - 502
Declared cursor already exists.
???
Самое интересное, что все начинает работать когда в DLL-ной форме завожу ЕЩЕ
ОДИН TIBDatabase и в списке создания компоненетов формы делаю его
предшествующим основному IBDatabase !!!

Помогите разобраться.
---------------------------------------------------------
а вот какое решение
-----------------------------------------------------
Yuri BOULOUI <bouloui@iiasa.ac.at> сообщил в новостях
следующее:aq0tl0$j3i$1@etna.demo.ru...
> Hello, Yuriy!
>
> Имеет смысл либо перейти на последнюю версию IBX (там вроде пофиксели эту
> проблему), либо в юните, скажем, где экспортируются функции из dll в
секции
> инициализации поставить randomize();
>
> With best regards, Yuri BOULOUI. E-mail: bouloui@iiasa.ac.at
>
Спасибо за помощь. Заработало.
Вставил в процедуру инциализации DLL пароцедуру Randomize:

procedure MyDllEntryPoint(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
Randomize;
...;
end;

Насколько я понял, в EXE-модуле и в DLL-модуле вызывается API-функция,
которая вызывает Random() для формирования уникального имени курсора. Так
как код для Random() дублируется и в EXE и в DLL (хотя и в рамках одного
процесса), то гарантии того, что последовательности случайных чисел в EXE и
в DLL могут пересечься. Это не гарантирует от того, что когда-то можно
нарваться на на этот же глюк.
Каков выход? Наверное имя курсора надо было формировать с учетом различия
модулей, например, по имени модуля формировать префикс для имени курсора.
Это всего лишь мои предположения. Насколько они далеки от истины?
-------------------------------------------------------
Возьми и добавь одну единственную строчку в IBUtils.pas
в секцию initialization
Randomize;

После чего выполни Build All.
---------------------------------------------------------

удачи. Теперь ты справишься.


 
Alexandr   (2003-01-12 14:23) [12]

а я пошел домой...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
1-96688
Calm
2003-01-20 13:49
2003.01.30
Работа приложения во время бездействия. Парадокс какой-то!


7-97043
XED
2002-11-17 12:03
2003.01.30
Hook!!!


1-96701
falcon_k
2003-01-22 02:09
2003.01.30
Как показать юзеру что прога работает и не повисла


14-97013
Anatoly Podgoretsky
2003-01-13 18:33
2003.01.30
W2K3


6-96936
NewGuest
2002-12-06 19:33
2003.01.30
Мастера, раз в D7 не установлены компаненты типа TclientSocket,то





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский