powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не выполняется UPDATE в Firebird
15 сообщений из 15, страница 1 из 1
Не выполняется UPDATE в Firebird
    #39755655
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точнее выполняется, но только после закрытия программы и нового запуска.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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, которая используется в ней:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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 хотя бы для начала, и началась такая вот канитель.
Может кто чего подскажет?
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755658
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOleg,

1. используй параметры для запросов
2. никогда не гаси сообщения об ошибках так чтобы они не оставляли следов
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755659
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOlegМожет кто чего подскажет?

Читай документацию по транзакциям и их использованию, ибо код у тебя совершенно бестолков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755665
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOleg if not FADOQuery.Active then begin
FADOQuery.Active:=true;

это бред какой-то. Зачем эти строки ПЕРЕД запихиванием в FADOQuery нового запроса?
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755668
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Протрезветь советовали?
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755683
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvBorodaOleg if not FADOQuery.Active then begin
FADOQuery.Active:=true;

это бред какой-то...
Потом сразу
[src]FADOQuery.Close;/SRC]
Наверное, "ругалось", если датасет был неактивен. Вот ТС и воткнул Active := true.
В общем, прекрасно.
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755686
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ругалась на FADOQuery.Transaction.StartTransaction; - говорила что транзакция активна, при этом FADOQuery.Active было false.
Пришлось обходить таким беответственным )) методом.
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755688
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Датасетов у меня вообще нет, все на SQL
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755696
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и вопрос то был поставлен: почему запись в БД идет только при выходе из программы. Построчно проверял, FADOQuery.Transaction.Commit срабатывает, а данные в базу не пишутся...
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755702
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOlegПострочно проверял, FADOQuery.Transaction.Commit срабатывает, а данные в базу не пишутся...

Или не читаются. Иди уже изучай управление транзакциями и их уровни изоляции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755739
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;

тогда код будет более понятен для последующего вспоминания, зачем и что написано месяц и более назад.
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755742
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOleg,

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

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

if FADOQuery.isOpen then FADOQuery.Close.
FADOQuery.SQL:=...
И всё.
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755824
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу проблемы со стороны файрберда, тут каша в дельфовом коде. Поехали в раздел дельфи.

Модератор: Тема перенесена из форума "Firebird, InterBase".
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755826
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа не моя, изначально писалась где - то в 2000 году, видать тогда еще доступ к БД осуществлялся только через ADO или программист который это писал, не знал просто другого способа, отсюда и ADO в названии, на самом деле все компоненты из серии InterBase, просто кому-то до меня было лень менять названия всех процедур )) просто прописали: FADOQuery : TIBQuery;
Что касаемо TAdoQuery.Active:=True, уже разобрался, что для проверки активности транзакции совершенно не нужна активная Query к которой эта транзакция привязана. Вообщем - моя глупость.
Вся проблема заключалась в том, что я где-то прочитал, что по умолчанию транзакция создается в уровне изолированности read_committed, ну и соответственно был в этом уверен. После того, как вручную прописал в параметрах транзакции:
nowait
read_committed
rec_version
все заработало. Я только одного не понимаю, почему все работало под Delphi 5 - там вроде те же компоненты?
В любом случае, спасибо всем кто отозвался...
...
Рейтинг: 0 / 0
Не выполняется UPDATE в Firebird
    #39755832
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOlegADO в названии, на самом деле все компоненты из серии InterBase, просто кому-то до меня было лень менять названия всех процедур )) просто прописали: FADOQuery : TIBQuery;
Я бы тебя забанил, но я не модератор.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не выполняется UPDATE в Firebird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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