Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Не выполняется UPDATE в Firebird  [new]
BorodaOleg
Member

Откуда:
Сообщений: 10
Точнее выполняется, но только после закрытия программы и нового запуска.

Ситуация такая, на форме лежит StringGrid (Обычный, не DB). По каждой строке имеются чекбоксы (их состояние и должно записываться). Остальные данные добиваются из параллельных потоков. Соответственно StringGrid перерисовывается раз в 5 секунд.
Если снимаешь или ставишь галочку на чекбоксе, отрабатывается функция setQueryGroupAbonsState, которая должна записывать их состояние в БД и при следующей перерисовке отобразить на экране. Так вот, процедура setQueryGroupAbonsState вызывается, ей передается нормальное значение, а при перерисовке восстанавливается старое состояние. Если программу закроешь, а потом запустишь по новой, состояние чекбоксов меняется...

function CDBase.setQueryGroupAbonsState(groupID,aboid,state:Integer):Boolean;
Var
    strSQL,sql : String;
    res    : Boolean;
Begin
    res := false;
    if (aboid=-1)  then sql := ' where QGID='+IntToStr(groupID);
    if (aboid<>-1) then sql := ' where aboid='+IntToStr(aboid);
    strSQL := 'UPDATE QGABONS SET ENABLE='+IntToStr(state)+sql;
    Result := ExecQry(strSQL)
End;


ExecQry, которая используется в ней:

function CDBase.ExecQry(strSQL:String):Boolean;       
Var
    res : Boolean;
Begin
    res := True;
    try
    if not FADOQuery.Active then begin
     FADOQuery.Active:=true;
     if not FADOQuery.Transaction.Active then
       FADOQuery.Transaction.StartTransaction;
    end;
    FADOQuery.Close;
    FADOQuery.SQL.Clear;
    FADOQuery.SQL.Add(strSQL);
    FADOQuery.ExecSQL;
    FADOQuery.Transaction.Commit;
    FADOQuery.Close;
   except
    FADOQuery.Transaction.Rollback;
    res := False;
   end;
   Result := res;
End;


Ну и создание самой коннекта к БД:

procedure CDBase.CreateConnection(var vConn:TIBDataBase;var vQry:TIBQuery);
Var
    IBTr : TIBTransaction;
Begin
     if vConn=Nil then
    Begin
      vConn := TIBDataBase.Create(nil);
      IBTr := TIBTransaction.Create(nil);
      with vConn do begin
       SQLDialect := 3;
       DatabaseName := m_strProvider;
       Params.Add('user_name=sysdba');
       Params.Add('password=masterkey');
       Params.Add('lc_ctype=WIN1251');
       LoginPrompt := False;
       DefaultTransaction := IBTr;
      end;
      vConn.Connected := True;
      if vQry=Nil then
      Begin
       vQry := TIBQuery.Create(Nil);
       vQry.Database:=vConn;
       vQry.Transaction:=IBTr;
      End;
    End;
End;


Интересно то, что на Дельфи 5 все работало на автокомите, вообще без проблемм, просто нужно переводить программу на Delphi 7 хотя бы для начала, и началась такая вот канитель.
Может кто чего подскажет?
3 янв 19, 13:14    [21777866]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 8976
BorodaOleg,

1. используй параметры для запросов
2. никогда не гаси сообщения об ошибках так чтобы они не оставляли следов
3 янв 19, 13:32    [21777872]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46713

BorodaOleg
Может кто чего подскажет?

Читай документацию по транзакциям и их использованию, ибо код у тебя совершенно бестолков.

Posted via ActualForum NNTP Server 1.5

3 янв 19, 13:33    [21777873]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27726
BorodaOleg
if not FADOQuery.Active then begin
FADOQuery.Active:=true;


это бред какой-то. Зачем эти строки ПЕРЕД запихиванием в FADOQuery нового запроса?
3 янв 19, 14:03    [21777881]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8133
Протрезветь советовали?
3 янв 19, 14:19    [21777887]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 401
kdv
BorodaOleg
if not FADOQuery.Active then begin
FADOQuery.Active:=true;


это бред какой-то...

Потом сразу
[src]FADOQuery.Close;/SRC]
Наверное, "ругалось", если датасет был неактивен. Вот ТС и воткнул Active := true.
В общем, прекрасно.
3 янв 19, 15:15    [21777907]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
BorodaOleg
Member

Откуда:
Сообщений: 10
Ругалась на FADOQuery.Transaction.StartTransaction; - говорила что транзакция активна, при этом FADOQuery.Active было false.
Пришлось обходить таким беответственным )) методом.
3 янв 19, 15:26    [21777910]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
BorodaOleg
Member

Откуда:
Сообщений: 10
Датасетов у меня вообще нет, все на SQL
3 янв 19, 15:29    [21777912]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
BorodaOleg
Member

Откуда:
Сообщений: 10
Да и вопрос то был поставлен: почему запись в БД идет только при выходе из программы. Построчно проверял, FADOQuery.Transaction.Commit срабатывает, а данные в базу не пишутся...
3 янв 19, 16:26    [21777933]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46713

BorodaOleg
Построчно проверял, FADOQuery.Transaction.Commit срабатывает, а данные в базу не пишутся...

Или не читаются. Иди уже изучай управление транзакциями и их уровни изоляции.

Posted via ActualForum NNTP Server 1.5

3 янв 19, 17:28    [21777954]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27726
BorodaOleg,

и что, в конкурирующем приложении в транзакции read committed rec_version ничего не видать? Сомневаюсь.

Собственно, а зачем в приложении на Delphi коннект к Firebird делать через ADO? Это какой-то специфический вид мазохизма, или условие какой-то универсальности (доступа к другим СУБД)?

BorodaOleg
Ругалась на FADOQuery.Transaction.StartTransaction; - говорила что транзакция активна, при этом FADOQuery.Active было false.

не вижу связи. Допустим, транзакция активна, и что? Зачем вызывать FADOQuery.Active ?
Собственно, TAdoQuery.Active:=True это ОТКРЫТИЕ датасета (аналог метода Open), в котором записан оператор SELECT.
Вы примеры хотя бы по TADOQuery смотрели?

Вот этот пример, допустим, для кого написан?
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ADODB_TADOQuery.html

А вот тут
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ADODB_TADOQuery_ExecSQL.html

написано совсем просто:
Note: For SELECT statements, call Open instead of ExecSQL or set the Active property to true.

p.s. это ко всем датасетам относится (типа, "датасеты не использую", но TADOQuery наследник TDataSet),
и для облегчения понимания кода я крайне не рекомендую пользоваться
DataSet.Active:=True
и
DataSet.Active:=False

надо вместо этого писать
DataSet.Open;
и
DataSet.Close;

тогда код будет более понятен для последующего вспоминания, зачем и что написано месяц и более назад.
3 янв 19, 21:31    [21778025]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27726
BorodaOleg,

и еще.
функция
function CDBase.ExecQry
написана так, что предполагает закрытие FADOQuery после выполнения - там написано FADOQuery.Close (хотя и по ошибке стоит после Commit, а должно быть до).

Таким образом, при вызове этой функции нахождение FADOQuery в открытом (активном) состоянии является нештатным. Если так - это хороший способ ловить места, где FADOQuery случайно оказался незакрыт. Или не так? Тогда надо было написать на входе

if FADOQuery.isOpen then FADOQuery.Close.
FADOQuery.SQL:=...
И всё.
3 янв 19, 21:40    [21778029]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8133
Не вижу проблемы со стороны файрберда, тут каша в дельфовом коде. Поехали в раздел дельфи.

Модератор: Тема перенесена из форума "Firebird, InterBase".
4 янв 19, 12:17    [21778313]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
BorodaOleg
Member

Откуда:
Сообщений: 10
Программа не моя, изначально писалась где - то в 2000 году, видать тогда еще доступ к БД осуществлялся только через ADO или программист который это писал, не знал просто другого способа, отсюда и ADO в названии, на самом деле все компоненты из серии InterBase, просто кому-то до меня было лень менять названия всех процедур )) просто прописали: FADOQuery : TIBQuery;
Что касаемо TAdoQuery.Active:=True, уже разобрался, что для проверки активности транзакции совершенно не нужна активная Query к которой эта транзакция привязана. Вообщем - моя глупость.
Вся проблема заключалась в том, что я где-то прочитал, что по умолчанию транзакция создается в уровне изолированности read_committed, ну и соответственно был в этом уверен. После того, как вручную прописал в параметрах транзакции:
nowait
read_committed
rec_version
все заработало. Я только одного не понимаю, почему все работало под Delphi 5 - там вроде те же компоненты?
В любом случае, спасибо всем кто отозвался...
4 янв 19, 12:27    [21778316]     Ответить | Цитировать Сообщить модератору
 Re: Не выполняется UPDATE в Firebird  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 401
BorodaOleg
ADO в названии, на самом деле все компоненты из серии InterBase, просто кому-то до меня было лень менять названия всех процедур )) просто прописали: FADOQuery : TIBQuery;

Я бы тебя забанил, но я не модератор.
4 янв 19, 12:50    [21778327]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить