Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > pFIBTransaction - не весь скрипт выполняется


Автор: jester7 8.12.2015, 10:14
Код

TRY
Form1.pFIBScripter1.AutoDDL:=true;
Form1.pFIBScripter1.Script.Clear;
Form1.pFIBScripter1.ExecuteFromFile(sql_name1,';');
 
Form1.pFIBTransaction1.Commit;
Form1.pFIBTransaction1.Active:=false;
EXCEPT
on E:EXCEPTION do form1.Memo1.Lines.Add('SQL_ERROR (exception): --> '+e.message);
END;



В скрипте (в файле):
"UPDATE OR INSERT INTO ***************************"
 и т.д. строк примерно 200

Какая-то часть выполнилась, какая-то нет. Видимо от половины и до конца не выполнилось

Нашел:
Application:
Object: "Form1.pFIBScripter1"
Operation:TrID=12599960 Error on execute query. Error message: "Form1.pFIBScripter1:
Violation of FOREIGN KEY constraint "".
Violation of FOREIGN KEY constraint "FK_AKCIANAME_2" on table "AKCIANAME".
Foreign key reference target does not exist.

добавил, чтоб не останавливалась на ошибке:
Код

procedure TForm1.pFIBScripter1ExecuteError(Sender: TObject; StatementNo,
  Line: Integer; Statement: TStrings; SQLCode: Integer; const Msg: string;
  var doRollBack, Stop: Boolean);
begin
     stop:=false;
 
end;


но пропускает куски целые.
НЕ вписывает в базу.


Немного подумали и пришли к выводу, что программа выполняет строки скрипта до тех пор, пока не встретит строку КОММИТА, после этой строки транзакции записываются в базу, а если ошибка происходит до КОММИТА, то транзакция до ошибки не записывается, вот и происходит потеря данных.

Вопрос: как сделать, чтоб КОММИТ сам работал, вне зависимости от встретившейся ошибки ???
Может параметры Транзакции выставить иначе ? или есть АУТОКОММИТ ?

П.С. временно добавил в файл скрипта "КОММИТ ВОРКИ" после каждой строки ))) - хоть так работает

подскажите, как обойти эту ошибку транзакции ?
Хотелось бы , чтоб любой файл скрипта программа отрабатывала правильно.




Автор: barmaley4ik 8.12.2015, 15:06
Не совсем понятно, что требуется. У тебя выбивается ошибка по внешнему ключу... НУ нет у тебя в связанной таблице такого ключа и все тут. Соответственно ошибка.. Данные не вставились. Скрипт отрабатывается правильно. Метод ExecuteFromFile не загружает весь файл в память, а считывает файл построчно. Попробуй pFIBScripter1.Script.LoadFromFile(FileName);
pFIBScripter1.ExecuteScript;

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/pFIBTransaction-ne-ves-skript-vypolnyayetsya-id56668376ae2015483c8b4567#findElement_E7045_5666c7b6ae2015c31d3b5d84_0

Автор: Akella 10.12.2015, 10:02
Часть скрипта выполняется, потом ошибка и после неё уже не выполняется.
Исправляй ошибку, выясняй откуда ноги растут.
А лучше так:
открытие транзакции
запуск скрипта
если ошибка - откат
если нет ошибок - подтверждение

тогда будет или всё откатываться или всё сохраняться

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/pFIBTransaction-ne-ves-skript-vypolnyayetsya-id56668376ae2015483c8b4567#findElement_E7045_5669237bae2015185d3b5db4_0

Автор: Alexeis 10.12.2015, 17:33
  Суть транзакции состоит в том, чтобы применить все или не применить ничего. Честно говоря я удивлен, что у вас изменения применяются частично. По идее не должны вовсе применяться. Если нужно чтобы запросы применялись независимо, то завершайте транзакцию после каждого.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)