Вот пример:
- Код: Выделить всё
- {$MODE DELPHI}
 program test;
 uses sysutils, SQLite3, SQLite3Wrap;
 var dSQLite3Base01 : TSQLite3Database;
 dStmt : TSQLite3Statement;
 begin
 if not FileExists('MyBase.db3') then
 begin
 dSQLite3Base01 := TSQLite3Database.Create;
 try
 dSQLite3Base01.Open('MyBase.db3');
 dSQLite3Base01.Execute('CREATE TABLE testtable (fied_a TEXT, fied_b TEXT)');
 dSQLite3Base01.Execute('CREATE UNIQUE INDEX a_b ON testtable(fied_a, fied_b)');
 finally
 dSQLite3Base01.Free;
 end;
 writeln('base created.');
 end;
 try
 dSQLite3Base01 := TSQLite3Database.Create;
 dSQLite3Base01.Open('MyBase.db3');
 dStmt := dSQLite3Base01.Prepare('INSERT INTO testtable (fied_a, fied_b) VALUES (?, ?)');
 try
 writeln('StepAndReset begin.');
 dStmt.BindText(1, '1AA');
 dStmt.BindText(2, '1BB');
 dStmt.StepAndReset;
 writeln('1');
 dStmt.BindText(1, '2AA');
 dStmt.BindText(2, '2BB');
 dStmt.StepAndReset;
 writeln('2');
 dStmt.BindText(1, '3AA');
 dStmt.BindText(2, '3BB');
 dStmt.StepAndReset;
 writeln('3');
 dStmt.BindText(1, '3AA');
 dStmt.BindText(2, '3BB');
 dStmt.StepAndReset;
 writeln('Again 3, must be exception!!!');
 except on E: Exception do
 writeln('exception catched, ', E.Message);
 end;
 dStmt.Free;
 writeln('StepAndReset done!');
 try
 writeln('trying illegal operation....');
 dSQLite3Base01.Execute('INSERT INTO testtable (fied_a, fied_b) VALUES ("1AA", "1BB")');
 writeln('after try.');
 except on E: Exception do
 writeln('exception catched, ', E.Message);
 end;
 finally
 dSQLite3Base01.Free;
 end;
 end.
Использую обёртку SQLite3.pas из источника http://indasoftware.com/sqlite/, который ведёт на http://github.com/plashenkov/SQLite3-Delphi-FPC.
Во втором случае из примера exception отлично ловится, а в первом - нет. Я пока до этого дошёл, чуть голову не сломал.
 И что мне теперь, групповой операцией не пользоваться? Я, конечно, могу каждый раз в цикле давать саму команду INSERT INTO через .Execute, но как-то это неправильно, как мне кажется...
 И что мне теперь, групповой операцией не пользоваться? Я, конечно, могу каждый раз в цикле давать саму команду INSERT INTO через .Execute, но как-то это неправильно, как мне кажется...


