Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
8-96894
Sergey V. Shadrin
2002-10-10 12:39
2003.01.30
MDIform & Image


1-96732
Part
2003-01-20 13:39
2003.01.30
Помогите плиз!!!


4-97104
boris2
2002-12-14 18:33
2003.01.30
окна


1-96743
Goro
2003-01-18 01:28
2003.01.30
Help! (диплом под угрозой)


8-96893
XPatriot()
2002-10-10 15:39
2003.01.30
Работа с Image ами