Форум: "Базы";
Текущий архив: 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.01 c