Вот пример:
- Код: Выделить всё
{$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, но как-то это неправильно, как мне кажется...