powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDac.Transaction помогите настроить
25 сообщений из 40, страница 1 из 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
25 сообщений из 40, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDac.Transaction помогите настроить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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