unit uTestSqlite;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,SQLiteTable3, ExtCtrls, jpeg;
type
TForm1 = class(TForm)
btnTest: TButton;
memNotes: TMemo;
Label1: TLabel;
Label2: TLabel;
ebName: TEdit;
Label3: TLabel;
ebNumber: TEdit;
Label4: TLabel;
ebID: TEdit;
Image1: TImage;
btnLoadImage: TButton;
btnDisplayImage: TButton;
procedure btnTestClick(Sender: TObject);
procedure btnLoadImageClick(Sender: TObject);
procedure btnDisplayImageClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnTestClick(Sender: TObject);
var
slDBpath: string;
sldb: TSQLiteDatabase;
sltb: TSQLIteTable;
sSQL: String;
Notes: String;
begin
slDBPath := ExtractFilepath(application.exename)
+ 'test.db';
sldb := TSQLiteDatabase.Create(slDBPath);
try
if sldb.TableExists('testTable') then begin
sSQL := 'DROP TABLE testtable';
sldb.execsql(sSQL);
end;
sSQL := 'CREATE TABLE testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,';
sSQL := sSQL + '[Name] VARCHAR (255),[Number] FLOAT, [notes] BLOB, [picture] BLOB COLLATE NOCASE);';
sldb.execsql(sSQL);
sldb.execsql('CREATE INDEX TestTableName ON [testtable]([Name]);');
//begin a transaction
sldb.BeginTransaction;
sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Some Name",4,587.6594,"Here are some notes");';
//do the insert
sldb.ExecSQL(sSQL);
sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Another Name",12,4758.3265,"More notes");';
//do the insert
sldb.ExecSQL(sSQL);
//end the transaction
sldb.Commit;
//query the data
sltb := slDb.GetTable('SELECT * FROM testtable');
try
if sltb.Count > 0 then
begin
//display first row
ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']);
ebID.Text := inttostr(sltb.FieldAsInteger(sltb.FieldIndex['ID']));
ebNumber.Text := floattostr( sltb.FieldAsDouble(sltb.FieldIndex['Number']));
Notes := sltb.FieldAsBlobText(sltb.FieldIndex['Notes']);
memNotes.Text := notes;
end;
finally
sltb.Free;
end;
finally
sldb.Free;
end;
end;
procedure TForm1.btnLoadImageClick(Sender: TObject);
var
slDBpath: string;
sldb: TSQLiteDatabase;
sltb: TSQLIteTable;
iID: integer;
fs: TFileStream;
begin
slDBPath := ExtractFilepath(application.exename)
+ 'test.db';
if not FileExists(slDBPath) then begin
MessageDLg('Test.db does not exist. Click Test Sqlite 3 to create it.',mtInformation,[mbOK],0);
exit;
end;
sldb := TSQLiteDatabase.Create(slDBPath);
try
//get an ID
//query the data
sltb := slDb.GetTable('SELECT ID FROM testtable');
try
if sltb.Count = 0 then begin
MessageDLg('There are no rows in the database. Click Test Sqlite 3 to insert a row.',mtInformation,[mbOK],0);
exit;
end;
iID := sltb.FieldAsInteger(sltb.FieldIndex['ID']);
finally
sltb.Free;
end;
//load an image
fs := TFileStream.Create(ExtractFileDir(application.ExeName) + '\sunset.jpg',fmOpenRead);
try
//insert the image into the db
sldb.UpdateBlob('UPDATE testtable set picture = ? WHERE ID = ' + inttostr(iID),fs);
finally
fs.Free;
end;
finally
sldb.Free;
end;
end;
procedure TForm1.btnDisplayImageClick(Sender: TObject);
var
slDBpath: string;
sldb: TSQLiteDatabase;
sltb: TSQLIteTable;
iID: integer;
ms: TMemoryStream;
pic: TJPegImage;
begin
slDBPath := ExtractFilepath(application.exename)
+ 'test.db';
if not FileExists(slDBPath) then begin
MessageDLg('Test.db does not exist. Click Test Sqlite 3 to create it, then Load image to load an image.',mtInformation,[mbOK],0);
exit;
end;
sldb := TSQLiteDatabase.Create(slDBPath);
try
//get an ID
//query the data
sltb := slDb.GetTable('SELECT ID FROM testtable');
try
if not sltb.Count = 0 then begin
MessageDLg('No rows in the test database. Click Test Sqlite 3 to insert a row, then Load image to load an image.',mtInformation,[mbOK],0);
exit;
end;
iID := sltb.FieldAsInteger(sltb.FieldIndex['ID']);
finally
sltb.Free;
end;
sltb := sldb.GetTable('SELECT picture FROM testtable where ID = ' + inttostr(iID));
try
ms := sltb.FieldAsBlob(sltb.FieldIndex['picture']);
//note that the memory stream is freed when the TSqliteTable is destroyed.
if (ms = nil) then begin
MessageDLg('No image in the test database. Click Load image to load an image.',mtInformation,[mbOK],0);
exit;
end;
ms.Position := 0;
pic := TJPEGImage.Create;
pic.LoadFromStream(ms);
self.Image1.Picture.Graphic := pic;
pic.Free;
finally
sltb.Free;
end;
finally
sldb.Free;
end;
end;
end.