delphi与sqlite

file:0 前言

本文的目的在于采用流水账方式来记录学习delphi访问嵌入式数据库sqlite中的一些点滴。欢迎各位同好共同学习和批评指正。

file:1 准备工作part1

delphi版本:delphi2007 for win32 update3。任意安装版本即可。
       sqlite dll版本:3.5.3。目前最新版本的sqlite引擎。[ http://www.sqlite.org/ ]
       sqlite for delphi:simple sqlite 3.0 for delphi。目前的最新版本的发布日期为27 August 2007,支持sqlite dll版本3.4.2。经简单测试,3.5.3也是可以的。自带demo。[ http://www.itwriting.com/sqlitesimple.php ]

file:2 准备工作part2

新建一个窗体应用程序工程,并设定保存的文件夹。将simple sqlite 3.0 for delphi 中的 sqlite3.pas,sqlite3table.pas,sqlite3udf.pas拷贝至工程所在的文件夹。并在工程中添加这三个文件。拷贝sqlite.dll到编译生成exe文件的文件夹。这个要看个人的设定。

file:3 初步测试

引用SQLiteTable3.pas单元。
      在窗体上创建一个叫btnVersion的按钮(Tbutton)。在btnVersion的click事件中写入下面的代码。
procedure TfrmAbout.btnVersionClick(Sender: TObject);
var
  SqliteDB:TSQLiteDatabase;
begin
  SqliteDB:=TSQLiteDatabase.Create(‘‘);
  showmessage(‘Sqlite dll version:‘+SqliteDb.version);
  SqliteDB.Free;
end;
      编译运行,成功的话,将会显示当前的sqlite dll的版本号,我的是3.5.3。

file:4 简单工作原理描述

在simple sqlite3.0 for delphi的几个文件中,主要用到两个文件。分别是sqlite3.pas,sqlite3table.pas。
      sqlite3.pas实现sqlite.dll的接口外部定义。
      sqlite3table.pas进行简单的访问函数封装。
      在delphi中,通过sqlite3table.pas来实现对sqlite数据库的各种访问。
      关于sqlite3udf.pas,根据作者的描述,主要用与创建用户自定义函数,具体功能未测试。

file:5 读取数据

假设,我们有一个叫做database.db的sqlite数据库文件,在编译生成的exe文件所在的目录。里面有一个叫做countries的表格。
      表格创建语句如下。
CREATE TABLE "Countries" (
Name VARCHAR NOT NULL PRIMARY KEY UNIQUE, 
Capital VARCHAR NOT NULL, 
Area INTEGER NOT NULL, 
Pop INTEGER NOT NULL, 
PCI INTEGER NOT NULL 
);
      我们该如何访问其中的第一条数据呢。
var
  SqliteDB:TSQLiteDatabase;
  SqliteTB:TSQLiteTable;
begin
  SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
  SqliteTB:=SqliteDB.GetTable(‘Select * from countries‘);
  显示控件1.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Name‘]);
  显示控件2.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Capital‘]);
  显示控件3.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Area‘]);
  显示控件4.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Pop‘]);
  显示控件5.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘PCI‘]);
  SqliteTB.free;
  SqliteDB.free;
end;
      TSQLiteTable类有两个方法,分别是Next和Previous,是用来向后和向前移动数据游标的。配合这两个方法,我们可以读取表格任意数据内容。例如select * from countries where area >8000000的数据。

file:6 写入数据

我们可以读取数据,就可以写入数据。如何来做到呢?还是以Countries表为例。
var
  SqliteDB:TSQLiteDatabase;
begin
  SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
  SqliteDB.ExecSQL(‘Insert Into Countries (Name,Capital,Area,Pop,PCI) values ("China","Beijing",9600000,1500000000,6000)‘);
  SqliteDB.Free;  
end;
      同样,数据的update方法也可以按照这种方法来实现。在这里可以看到,字符类数据可以用双引号来标记起来,而不是通常sqlserver的单引号标记。

file:7 字符编码

访问过MySql数据库数据的朋友应该记得噩梦般的中文数据存取经历。数据库里用了一种编码,程序又是另一种编码,导致中文数据变成乱码。
      sqlite中,数据库内用的是UTF-8存取,DELPHI取出的数据是ASCII编码。也就是说,我们需要在存取的同时做编码转换。
      有这样两个方法,utf8decode(),utf8encode()。当从数据库中读取数据时,我们用utf8decode();当向数据库中写入数据时,我们用utf8encode();
      例如:
显示控件.text:=utf8decode(sltb.FieldAsString(sltb.FieldIndex[‘Name‘]));
SqliteDB.ExecSQL(utf8encode(‘Insert Into Countries (Name,Capital,Area,Pop,PCI) values ("中国","北京",9600000,1500000000,6000)‘));
      在有更好的方法之前,我们只能这么用……

file8: Blob Blob Blob

某些时候,我们会需要向数据库中存储和读取图片,视频,音频等信息的数据,例如:前女友们的性感照片。sqlite中有一种数据类型叫做Blob,可以满足我们的要求。如何访问和读取呢?
      下面以在database.db数据库中PhotoLib表格中存取一个JPEG图片为例:
CREATE TABLE "PhotoLib" (Id Integer NOT NULL PRIMARY KEY UNIQUE, 
Photo BLOB);
      写入:
var
SqliteDB: TSQLiteDatabase;
FS: TFileStream;
begin
SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
FS := TFileStream.Create(‘test.jpeg‘,fmOpenRead);
SqliteDB.UpdateBlob(‘UPDATE PhotoLib set Photo = ? WHERE ID = 1‘,FS);
FS.free;
SqliteDB.Free;
end;
      读取至TImage控件显示:
var
MS: TMemoryStream;
PIC: TJPegImage;
SqliteDB: TSQLiteDatabase;
SqliteTB: TSQLIteTable;
begin
SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
SqliteTB:=SqliteDB.GetTable(‘Select * From PhotoLib Where Id=1‘);
MS := SqliteTB.FieldAsBlob(SqliteTB.FieldIndex[‘photo‘]);
if (MS = nil) then
begin
  showmessage(‘该条记录没有前女友照片数据.‘);
  exit;
end;
MS.Position := 0;
PIC := TJPEGImage.Create;
PIC.LoadFromStream(ms);
self.Image2.Picture.Graphic := PIC;
MS.free;
PIC.Free;
end;

时间: 2024-10-29 10:46:13

delphi与sqlite的相关文章

解决delphi 在sqlite插入日期变成1899-12-30日问题。

产生原因的win7系统的短日期格式“yyyy/m/d”,在给sqlit中的日期格式字段插入当前日期时用DateTimeToStr(Now)函数, 该值有时候会在sqlite表中会有时候变成1899-12-30.要解决该问题要在主form的Create事件中设置程序的时间格式,还要设置 Application.UpdateFormatSettings := False;使程序不受系统时间格式影响. Application.UpdateFormatSettings := False; // 设定程序

delphi显示Sqlite的Text字段

1 procedure Mainform.SetField(Sender: TField; var Text: string; 2 DisplayText: Boolean); 3 begin 4 Text := Sender.AsString ; 5 end; 6 7 procedure TClientform.UniQuery1AfterOpen(DataSet: TDataSet); 8 var 9 i :Integer ; 10 begin 11 with DataSet do 12 b

DELPHI XE5 与SQLITE

最近一次使用DELPHI做项目是使用DELPHI2009,为了访问本地数据库方便,使用ACCESS数据库,不需要安装驱动,(WINDOWS自带),但是ACCESS数据库的性能确实很糟糕,通过ADO连接,INSERT 1000条数据平均在1.5秒以上. 面前面临一个新的项目,本地数据库是继续用ADO,还是其他,成了一个问题. 近期比较流行的本地数据库是SQLite,想测试下SQLite的性能,和方便程度. 1. DELPHI 和 SQLITE在度娘上提的最多的是通过ASQLite3DB组件进行连接

delphi Sqlite

Delphi中SQLite如何读写二进制字段(Blob类型) 在Delphi中,有大量的组件可以操作SQLite数据库,如UniDAC就是其中一个比较优秀的,当然还有ASQLite3Components,也有SQLite3版的ODBC驱动,可直接用ADO操作.本文简要说明SynopseSQLite3读写二进制字段,先说下SynopseSQLite3的优点,静态编译集成SQLite3引擎,不需要额外的DLL支持,支持SQLite3加密,支持JSON表,支持网络版的SQLite3.支持线程安全保护.

Delphi APP 開發入門(八)SQLite資料庫

Delphi APP 開發入門(八)SQLite資料庫 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:5279 發表時間:2014/06/25 tags: 行動開發 教學 App Delphi XE6 Android iOS SQLite Delphi APP 開發入門(七)通知與雲端推播 << 前情 在撰寫APP程式時,如果遇到資料間無關聯性且資料量不多時,會以像xml檔案去儲存,但一旦遇到關聯

delphi xe7操作sqlite数据库

准备工作: 1.用SQLiteExpertPers建立一个sqlite数据库. 2.打开delphi xe7. 一.FireDAC法 设置库联接 1.放入FDConnection1控件 2.点击“FDConnection1.Params” 3.在“FDConnection1.Params”中写入 DriverID=SQLite Database=C:\Users\zhujianqiang\Desktop\sqlite\sqlite.db  //你的sqlite数据库路径 4.点“确定” 5.设置

Delphi XE10下用FireDAC与SQLite连接要注意的问题

Delphi在XE的版本上,已经实现了安卓与苹果的移动跨平台,因此只需要一份代码,就可以统领两种手机平台,确实是一种高效的做法和节约的策略. 用Delphi XE7连接SQLite,主流使用FireDAC,即拖4个控件,就可以实现数据连接与提取. 1. FDPhySQLiteDriverLink1 2. FDGUIxWaitCursor1 2.FDConnection1 3. FDQuery1 最主要是在FDConnetion参数定义部分,首先是SQLite数据库,要以UTF8存储数据,这样,O

如何在 Delphi 中静态链接 SQLite

搞了我几个小时,终于成功在 Delphi 中静态链接了 SQLite (v3.5.4),下一步就是研究加密了,呵呵中间其实遇到很多问题,今天累了,就不说了,改天补上 下载测试工程 下面说说方法 1.当然是下载 SQLite 的源代码啦,呵呵,不过记得要是 all in one 的 amalgamation 版本哦  (修正: amalgamation 并非 all in one, 只是 core code all in one, 源代码里的其他文件也是不能少的!)2.解压缩,得到3个文件 sql

sqlite - Sqlite Wrappers - Delphi

http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers Aducom's SQLite: Open source (NewBSD) Delphi (4..2007) C++ (BCB5, 6, 2007) and 2009/2010 components for SQLite V2.8.x and V3.x.x. (like TASQLiteDB, TASQLiteQuery, TASQLiteTable, TASQLiteUpdateSQL an