delphi与sqlite3

=============================================================================
delphi与sqlite3

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。目前的最新版本的发布日期为Update 16 October 2008,支持sqlite dll版本3.4.2。经简单测试,3.5.3也是可以的。自带demo。 http://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3/comment-page-2 


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.9。


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 ;

转载于:https://www.cnblogs.com/xunxun/archive/2011/03/02/1969207.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值