powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDac.Transaction помогите настроить
40 сообщений из 40, показаны все 2 страниц
FireDac.Transaction помогите настроить
    #39750354
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Delphi 10.3 FireDac Firebird.

Бросил на форму 4 компонента FDConnection FDTransation FDQuery и FDDriver.

Параметры транзакции:
write
read_committed
rec_version
nowait

Написал процедуру, которая редактирует в БД запись, сделал к ней select через FDQuery и передал параметры:

function TForm1.EditEventsTest(var i, outError: Integer): Variant;
begin
with qEventEdit do
begin
if not Transaction.Active then
Transaction.StartTransaction;
try
ParamByName('AOPERATION').Value := 1;
ParamByName('ID').Value := '454A9F34-E0F2-4273-8BEC-ED11AFAC0BAE';
ParamByName('ID_DOCUMENT').Value := '9CF8A379-D83C-4B56-8721-0715896E3241';
ParamByName('KIND').Value := 2;
ParamByName('TIME$EVENT').Value := Null;
ParamByName('TIME$LAST_SEND').Value := Null;
ParamByName('SEND$RESULT').Value := IntToStr(i);// 'test';
ParamByName('IS_SENDED').Value := 1;
ParamByName('SEND$COUNTER').Value := 35;
ParamByName('STATE').Value := 0;
Open;

Result := FieldByName('OUT_ID').Value;
outError := FieldByName('OUT_ERROR').AsInteger;

if (outError = 0) then
begin
Transaction.Commit;
end
else
Transaction.Rollback;
except
Transaction.Rollback;
end;
end;
end;

Собственно, вопрос, почему первый commit вносит изменения в базу данных, а последующий вызов процедуры нет, ошибок при этом не возникает.

Ошибки в запросе быть не может быть т.к. клиент на Delhi 7 всё прекрасно редактирует.

Упростил приложение для того, что бы понять в чём проблема. У приложения одна единственная пишущая транзакция, чтения приложение не осуществляет.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750357
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProСобственно, вопрос, почему первый commit вносит изменения в базу данных, а последующий
вызов процедуры нет, ошибок при этом не возникает.

Вариантов два:
1) OUT_ERROR возвращает не ноль, но ты об этом не знаешь из-за отсутствия диагностики.
2) Возникает исключение, но ты опять же об этом не узнаешь, поскольку молча подавил его в
except.

PS: Этот список не включает совсем уж идиотские варианты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750361
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, код 100% рабочий, просто выкинул обработку out_Error + есть debug в делфи =) умеем проктикуем. Он встаёт на commit и всё, а в БД изменений нет. Но при первом запуске программы всё работает.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750362
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где текст?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750364
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий, текст чего?
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750372
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
краткость - сестра!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProкод 100% рабочий, просто выкинул обработку out_Error + есть debug в делфи =) умеем проктикуем.

Значит остаются только совершенно идиотские варианты класса "вызываемая процедура не
изменяет базу, поскольку в ней есть SUSPEND". Включай трассировку на стороне сервера и
смотри что на самом деле происходит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750382
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro> Мимопроходящий, текст чего?

ХП.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750389
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, судя по ответам, вы совсем не понимаете сути проблемы. По этому что бы вы дибила из меня не делали отвечаю...

Сделал тестовые таблицы и 1 процедуру

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE TEST_TABLE (
    TID   D_INT NOT NULL /* D_INT = INTEGER */,
    NAME  D_STR10 /* D_STR10 = VARCHAR(10) */
);

ALTER TABLE TEST_TABLE ADD CONSTRAINT PK_TEST_TABLE PRIMARY KEY (TID);

CREATE OR ALTER PROCEDURE TEST (
    NAME D_STR10)
RETURNS (
    OUT_ERROR D_INT)
AS
begin
  OUT_ERROR = 0;

  update TEST_TABLE TT
  set TT.NAME = :NAME
  where (TT.TID = 1);
  suspend;
end;




Затем в делфи sql запрос и процедуру

Код: plsql
1.
2.
3.
select
  *
from test(:NAME)




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TFmTest.Test;
begin
  with qEventEdit do
  begin
    if not Transaction.Active then
      Transaction.StartTransaction;
    try
      ParamByName('NAME').Value := edtName.Text;
      Open;

        Transaction.Commit;
    except
      Transaction.Rollback;
    end;
  end;
end;



Так вот если мы просто напишем в компоненте update TEST_TABLE TT set TT.NAME = :NAME where (TT.TID = 1); и затем вызовем метод ExecSql. Всё работает.

А в моём случае с хранимкой работает лишь первый commit далее изменения не попадают в БД.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750396
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProсудя по ответам, вы совсем не понимаете сути проблемы.

Я отлично понимаю суть проблемы, а вот ты, очевидно, не понял суть совета "включай
серверную трассировку и смотри что на самом деле происходит".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750402
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Open;

Result := FieldByName('OUT_ID').Value;
outError := FieldByName('OUT_ERROR').AsInteger;

if (outError = 0) then
begin
  Transaction.Commit;

Проверь OUT_ERROR на нулл.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750407
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, признаюсь честно никогда не юзал, но в IBExpert-е почему-то пишет, не найдено сессий. Хотя запустил и своё приложение и написанное на Delphi 7, уж оно то точно должно было отобразиться.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750408
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad, Ошибка не в коде, а в методе Open...
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750409
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProпризнаюсь честно никогда не юзал, но в IBExpert-е почему-то пишет, не найдено сессий. Хотя
запустил и своё приложение и написанное на Delphi 7, уж оно то точно должно было отобразиться.

Ну вот и ответ: приложение меняет данные не в той базе, в которой ты ожидаешь изменений.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750413
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, эх... нет, скорее всего это моё неправильное использование трассировки.

Я специально для вас, пока мы вели дисскусию создал тестовую таблицу с процедурой, если бы я коннектился к другой БД то ошибка вылетела Exists, а так признаки те же:

Выполняешь через FireDac прямой запрос к таблице Update Test where Column и вызываешь ExecSQL.

А если через процедуру, которая возвращает данные тобеж selet * from procedure() и вызываешь метод Open, изменения упадут лишь 1 раз.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750419
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro> Open;

А если вместо Open вызвать Execute (или как она там) ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750420
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro> А в моём случае с хранимкой работает лишь первый
RackotPro> commit далее изменения не попадают в БД.

Так ХП одну запись меняет или несколько?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750423
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам, Execute ошибка, используйте метод Open. Там в хранимке запрос я кидал выше таблица из 2х полей, меняет одну запись.

Код: plsql
1.
2.
3.
  update TEST_TABLE TT
  set TT.NAME = :NAME
  where (TT.TID = 1);



Собственно, накидал IB компонентов код не меняя всё работает изменил в with ibquery do и всё работает. Но вопрос остаётся открытым почему FireDac коммитит изменения только 1 раз и всё при вызове в select ХП.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750427
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, всё тему можно закрыть.

Видимо свзяано это с каким-то оптимизаторов внутри компонента.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  with qEventEdit do
  begin
    if not Transaction.Active then
      Transaction.StartTransaction;
    try
      Prepare;
      ParamByName('NAME').Value := edtName.Text;

      Open;
      Refresh;

        Transaction.Commit;
    except
      Transaction.Rollback;
    end;
  end;



Обязательно добавьте Refresh.

Всем спасибо все свободны...
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750451
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProhvlad, Ошибка не в коде, а в методе Open...Так ты проверил ?
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750460
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro,

Refresh ни к селу ни к городу. И явно ведь RefreshSQL тут не прописан.
Дело в том, что у разных компонент при Open может делаться fetch первой записи, а может и не делаться, это зависит от настроек (свойств) конкретного датасета.
До кучи - у FireDAC наверняка должен быть какой-то компонент "мониторинга" того, что он отсылает на сервер. Типа SQLMonitor или что-то вроде. И смотреть в первую очередь надо в нем. Потом - да, если что-то непонятное происходит, уже в трейсе.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750464
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Не исключено, что у отважного экспериментатора банально на хватало Close().
Ибо не факт, что FireDAC свои Query по завершению транзакций обязан закрывать.))
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750465
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov"вызываемая процедура не
изменяет базу, поскольку в ней есть SUSPEND"

RackotProвы совсем не понимаете сути проблемы. По этому что бы вы дибила из меня не делали отвечаю...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR ALTER PROCEDURE TEST (
    NAME D_STR10)
RETURNS (
    OUT_ERROR D_INT)
AS
begin
  OUT_ERROR = 0;

  update TEST_TABLE TT
  set TT.NAME = :NAME
  where (TT.TID = 1);
  suspend;
end;



suspend таки предугадан, хотя бы одну запись кто-нибудь попытался сфетчить?

не надо писать suspend в процедуре меняющей что-либо.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750471
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F, есть у делфи дебаг... можно посмотреть состояние транзакции после коммита. Сядь да потестируй вон выше код есть. Смысл вот этих бездумных отписок?
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750475
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky, внимательность 100500 весь смысл как раз в suspende и в этой процедуре возвращается out_error, которому присвоенна 1-ца и сделанно, так для примера, что бы убедится, что там не null и т.п. В реальной жизни процедура возвращает не только out_error поэтому нужна была именно такая процедура. Которая пишет и возвращает какой либо результат, в следствии чего мы вынуждены использовать метод Open и т.д. т.п. всё то что было выше.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750481
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProVlad F, есть у делфи дебаг... можно посмотреть состояние транзакции после коммита. Сядь да потестируй вон выше код есть. Смысл вот этих бездумных отписок?
- А вы что же, - и жевать за меня будете?!
- Ага!! (с) Вовка в тридевятом царстве.))
P.S. Мне кажется, клиент пропустил про Close() мимо уха.))
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750490
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProвесь смысл как раз в suspende и в этой процедуре возвращается out_error

Ты не поверишь, но для возврата скаляра SUSPEND не нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750493
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Замечу, что клиент не откатить не может, а и, всего лишь, повторно обновить. ;)
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750645
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TFmTest.Test;
begin
  with qEventEdit do
  begin
    if not Transaction.Active then
      Transaction.StartTransaction;
    try
      ParamByName('NAME').Value := edtName.Text;
      Open;

        Transaction.Commit;
    except
      Transaction.Rollback;
    end;
  end;
end;





Vlad F прав. У вас, в вашей функции на Делфи, после текста:
Код: pascal
1.
2.
3.
 except
      Transaction.Rollback;
    end;


как минимум не хватает CLOSE; чтобы закрыть ваш запрос.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750648
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

Ну лично я бы поставил его в данном тексте сразу после Open().))
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39750649
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
граждане тунея.. погромисты!
а шо это вы тут дельфи обсуждаете?

зы: направьте уже таки поциента в уютненький к Рустаму.
Posted via ActualForum NNTP Server 1.5

Модератор: Тема перенесена из форума "Firebird, InterBase".
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830011
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похожая ситуация, если коммитить простой инсерт или апдейт - все работает, а если коммитить процедуру - не сохраняет. В чем может быть дело?
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830030
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

Дохтур по фотографии на лечит. (с))
Пример кода давай, когда работает и когда нет.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830071
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F,
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
procedure TActivities.SendToDB;
var
  Query: TFDQuery;
  i: Integer;
begin
  Query:= TFDQuery.Create(nil);
  with Query do
  try
    Connection:= FFDB; // TFDConnection
    try
      SQL.Text:= 'Execute procedure Some_proc1(:date_from, :date_to)';
      ParamByName('date_from').AsDate:= FDFrom;
      ParamByName('date_to').AsDate:= FDTo;
      SetTransaction(Query, True);
      ExecSQL;
      Transaction.Commit;
    except
      on E: Exception do
      begin
        Transaction.Rollback;
        SetTransaction(Query, True);
      end;
    end;
 
    SQL.Text:= 'execute procedure some_proc2(:date_id, :user_id)';
    for i:= Low(FArrActivities) to High(FArrActivities) do
      with FArrActivities[i] do
      try
        ParamByName('date_id').AsDate:= DateID;
        ParamByName('user_id').AsString:= UserID;
        SetTransaction(Query, True);
        ExecSQL;
      except
        on E: Exception do
        begin
          Transaction.Rollback;
          SetTransaction(Query, True);
          Continue;
        end;
      end;
    Transaction.Commit;
  // а вот это работает
  with Query do
  begin
    Close;
    SQL.Text:= 'insert into t_some_table (date_id, user_id) values (:date_id, :user_id)';
    ParamByName('date_id').AsDate:= DateID;
    ParamByName('user_id').AsString:= UserID;
    ExecSQL;
    Transaction.Commit;
  end;
end;


Последнюю часть писал на коленке, но принцип думаю ясен. Да, еще вот:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TGIOActivities.SetTransaction(Query: TFDQuery; Write: Boolean);
begin
  with Query do
  begin
    case Write of
      False:
        if Transaction <> FFTRRead then
          Transaction:= FFTRRead;
      True:
        if Transaction <> FFTRWrite then
          Transaction:= FFTRWrite;
    end;
    Transaction.StartTransaction;
  end;
end;
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830124
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford, экцепшн, если он возникает, то гасится. А ошибки нет.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830125
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45, я прописывал в эксепте записи в логи, и прям перед ним что все успешно. Все отрабатывает нормально, но не сохраняет в
БДв случае запуска процедуры.
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830127
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в хранимых процедурах простой инсерт или удаление с набором параметров
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830149
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрел трассером (trace and audit), в первой процедуре есть коммит - мой косяк, она работает, а во второй нет (вызовы процедуры, параметры, все проходит), хотя в коде он четко прописан после цикла...
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830154
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дебаггером по Transaction.Commit проходит.
Жаль, что на форуме можно только написать сообщение, а не отредактировать
...
Рейтинг: 0 / 0
FireDac.Transaction помогите настроить
    #39830169
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем SetTransaction(Query, True) перед ExecSQL было лишним, надо перед циклом было присваивать, я перезапускал транзакции не коммитя их. Ошибка из-за кривости рук.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDac.Transaction помогите настроить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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