program smalltest;
{$MODE OBJFPC}{$H+}
uses
classes, sysutils, db, sqldb, sqlite3conn;
var
DBConnection : TSQLite3Connection;
DBTransaction : TSQLTransaction;
DBQ : TSQLQuery;
{$IFDEF LCL}
// For Lazarus Change MainForm.YourLogMem to point to a (active) Memo on your Form
LogMemo : TMemo absolute MainForm.YourLogMemo;
{$ENDIF}
procedure WriteLog(S:String);inline;begin{$IFDEF LCL}LogMemo.Append{$ELSE}WriteLn(S){$ENDIF};end;
procedure WriteLog;begin WriteLog('')end;
procedure WriteLog(S:String;const a:array of const);begin WriteLog(Format(S,a));end;
procedure CreateDB;
begin
DBConnection := TSQLite3Connection.Create(nil);
DBConnection.DatabaseName := ':memory:';
DBTransaction := TSQLTransaction.Create(DBConnection);
DBTransAction.Database := DBConnection;
DBQ := TSQLQuery.Create(DBConnection);
DBQ.Database := DBConnection;
DBQ.Transaction := DBTransaction;
end;
procedure DestroyDB;
begin
DBConnection.Free;
end;
procedure CreateTable(aTableName: String; aFields: String);
begin
DBQ.SQL.Clear;
DBQ.SQL.Add('CREATE TABLE ' + aTableName.QuotedString);
DBQ.SQL.Add('( ');
DBQ.SQL.Add(aFields);
DBQ.SQL.Add(' )');
DBQ.ExecSQL;
end;
procedure test;
var
Statement : string;
Price : currency;
doubt : double;
isSold : boolean;
begin
// i have taken real instead of double, but it is the same affinity and should therefor work similar
CreateTable( 'test', '"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT , "price" REAL, "sold" BOOLEAN DEFAULT 0, "date" DATETIME' );
Statement := 'INSERT into test(price, date) values';
DBConnection.ExecuteDirect(Statement + '( 100.01, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 200.02, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 400.03, date(''mow'') );');
DBConnection.ExecuteDirect(Statement + '( 800.04, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 1600.05, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 3200.06, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 6400.07, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 12800.08, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 25600.09, date(''now'') );');
DBConnection.ExecuteDirect(Statement + '( 51200.10, date(''now'') );');
DBQ.SQL.Text := 'SELECT "id", "price", "sold", "date" FROM "test"';
DBQ.Open;
WriteLog('RecordCount = %d', [DBQ.RecordCount]);
while not DBQ.EOF do
begin
WriteLog('Current record number is = %d', [DBQ.RecNo]);
// for testing purpose, only make changes to the first record
if DBQ.RecNo = 1 then
begin
WriteLog('Test with record number %d', [DBQ.RecNo]);
// try a boolean
isSold := DBQ.FieldByName('sold').AsBoolean;
// we are using booltostr here, because the helper gains us no advantage (its dumb)
WriteLog('Is current record sold ? %s', [BoolToStr(isSold, 'yes', 'no')]);
// try with currency
price := DBQ.FieldByName('price').AsCurrency;
WriteLog('Price as currency = %.2f', [price]);
price := price + 10.20;
DBQ.Edit;
DBQ.FieldByName('price').AsCurrency := price;
DBQ.Post;
price := DBQ.FieldByName('price').AsCurrency;
WriteLog('Price as currency = %.2f', [price]);
// try with double
doubt := DBQ.FieldByName('price').AsFloat;
WriteLog('Price as double = %.2f', [doubt]);
doubt := doubt + 30.30;
DBQ.Edit;
DBQ.FieldByName('price').AsFloat := doubt;
DBQ.Post;
doubt := DBQ.FieldByName('price').AsFloat;
WriteLog('Price as double = %.2f', [doubt]);
end;
DBQ.Next;
end;
DBQ.Close;
end;
procedure RunningMan;
begin
WriteLog('begin');
CreateDB;
try
test;
finally
DestroyDB;
end;
WriteLog('end');
end;
begin
RunningMan;
end.