You are not logged in.
Pages: 1
The problem is this: if you use a table with a unique field, then after trying to add a record with an existing value of adding a new record with a nonexistent value is always an error. Re-add the same record is successful.
Example of incorrect behavior of add a record:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SQLite3Commons, SQLite3;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TSQLTest = class(TSQLRecord)
private
fTest: Integer;
published
property Test: Integer read fTest write fTest stored False;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
SQLModel: TSQLModel;
SQLServer: TSQLRestServerDB;
SQLTest: TSQLTest;
begin
SQLModel:= TSQLModel.Create([TSQLTest]);
SQLServer:= TSQLRestServerDB.Create(SQLModel, ChangeFileExt(ParamStr(0), '.db'));
SQLServer.CreateMissingTables(0);
SQLServer.EngineExecuteAll('DELETE FROM Test');
SQLTest:= TSQLTest.Create;
SQLTest.Test:= 1;
SQLServer.Add(SQLTest, True);
if SQLServer.Add(SQLTest, True) = 0 then
ShowMessage('Error 1'); //correct behavior, because record with the same value exists
SQLTest.Test:= 2; //change the value in the record
if SQLServer.Add(SQLTest, True) = 0 then
ShowMessage('Error 2'); //why?
if SQLServer.Add(SQLTest, True) = 0 then
ShowMessage('Error 3'); //re-adding does not cause errors
SQLTest.Free;
SQLServer.Free;
SQLModel.Free
end;
end.
Last edited by yurasek (2012-01-05 22:50:44)
Offline
There was an issue with the current implementation.
TSQLRequest.Reset() method was triggering an error about the latest statement execution state, which should have been just ignored.
It's now fixed.
See http://synopse.info/fossil/info/0c22307d37
Thanks a lot for the feedback and the supplied code to reproduce the problem!
Offline
Pages: 1