powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FIBPlus и CheckValidStatement. Проблемы в потоке
8 сообщений из 8, страница 1 из 1
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39283834
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Возникла странная проблема в FIBPlus 7.4.1731. Постараюсь описать подробно. Сорри, если оффтоп.

Есть своя функция, которая возвращает результат запроса в TStringList. Вот фрагмент функции, значимый на мой взгляд. Если нужно больше инфы, то могу предоставить. Эта функция работает без ошибок в основном соединении программы.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function TSrvModule.getRecList_List( xSQL : string;
                                     xParams : array of Variant;
                                     xTrans : TpFIBTransaction;
                                     xQuery : TpFIBQuery ) : TStringList;
begin
  Result := TStringList.Create;
  try
    with xQuery do
    begin
      Close;
      if not Database.Connected then exit;
      Transaction := xTrans;
      ParamCheck := false;
      ParamCheck := true;
      SQL.Text := xSQL;
      CheckValidStatement;
      if not setParams(vQuery, xParams) then exit; // своя функция установки параметров
      ExecQuery;
      ....


Теперь же понадобилось вынести ее вызов в поток. В потоке создается экземпляр БД, транзакция и запрос:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
FDB := TpFIBDatabase.Create(nil);
FDB.SQLDialect := 3;
FDB.ConnectParams.CharSet := 'UNICODE_FSS';
FDB.ConnectParams.IsFirebird := true;
FDB.SaveAliasParamsAfterConnect := false;
FDB.LibraryName := SrvModule.DB.LibraryName; // SrvModule.DB - то самое основное соединение
...
vTrans := TpFIBTransaction.Create(FDB);
vTrans.DefaultDatabase := FDB;
vTrans.StartTransaction;
...
vQuery := TpFIBQuery.Create(nil);
vQuery.Database := FDB;
vQuery.Transaction := vTrans;


Далее вызываем первую функцию
Код: pascal
1.
SrvModule.getRecList_List( S, [], vTrans, false, '', xQuery );


На строке CheckValidStatement появляется ошибка: Invalid Statement Handle . В исходниках видно, что CheckValidStatement вызывает TFIBQuery.Prepare, в которой и возникает ошибка на строке:
Код: pascal
1.
2.
3.
4.
Call(isc_dsql_prepare(SV, TRHandle, @FHandle, 0,
PAnsiChar(FPreparedSQL ),
DataBase.SQlDialect,
FSQLRecord.FXSQLDA),True);


Решил убрать вызов CheckValidStatement и свой setParams (т.к. в данном случае в запросе нет параметров) и оставить только ExecQuery. В этом случае запрос выполняется без ошибок и возвращает правильные строки. Примечательно, что в самом ExecQuery тоже есть вызов TFIBQuery.Prepare, который в этом случае проходит без ошибки.

Конечно, можно для потоков готовить запросы без параметров, вставляя нужные значения в текст запроса напрямую, и не вызывать CheckValidStatement, и это наверняка решит проблему. Но вопрос причины ошибки останется не решенным. И где это позже может проявиться, тоже сейчас неизвестно.

Кто-нибудь может подсказать, в чем причина ошибки?

p.s. TSrvModule.getRecList_List исправно работает в приложении уже несколько лет.
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39283841
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уверен что вызов SrvModule.getRecList_List в том же потоке где создавался коннект
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39283851
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Frees,

уверен.

Забыл сказать, что ошибка происходит только при коннекте по IP-адресу, типа 192.168.1.4/3055. Если соединяться локально через localhost/3055, то проблем нет. Точнее, сначала была похожая проблема, которая решилась установкой FDB.SQLDialect := 3.
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39283853
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тогда твой setParams и коннект заодно запросу прописывает?
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39283855
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Frees,

тоже нет. Да и к тому же "фибовский" CheckValidStatement вызывается раньше.
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39284158
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор Result := TStringList.Create;
В случае несоединенной базы выделенная здесь память утечет
автор Close;
Как запрос м.б. открытым на несоединенной базе?
автор ParamCheck := false;
ParamCheck := true;

Это что еще за передергивание ))

авторВ потоке создается экземпляр БД, транзакция и запрос:
Я надеюсь, этот кусок содержится в Execute, а не в конструкторе потока?
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39284182
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Го-стхи,
1. память не утечет, т.к. внизу finally.
2. Close тут может и лишний, но он явно не мешает.
3. "Передергивание" тоже не мешает.
4. Создание FDB в Execute, а остальное в приватной функции потока
Код: pascal
1.
function getDCList : TStringList;

Могу попробовать все создавать в Execute, задекларировав в классе TThreadSQL = class(TThread).
...
Рейтинг: 0 / 0
FIBPlus и CheckValidStatement. Проблемы в потоке
    #39284352
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Marcello,
1. Еще как утечет, у тебя Create до try
4. Тут я перебдел, скорее всего, это не играет роли - это для окон требуется, а с обычными классами не должно влиять. Хотя, кто знает, что там в кишках компонентов. Но у меня IBX в доп. потоке работает, а создается в конструкторе, и всё пучком.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FIBPlus и CheckValidStatement. Проблемы в потоке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]