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单元。 use SQLiteTable3

在窗体上创建一个叫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;

delphi 与 sqlite3的更多相关文章

  1. delphi操作sqlite3

    Delphi SQLite 简明无废话上手指南SQLite下载http://www.sqlite.org/download.html SQLite FAQhttp://www.sqlitecn.org ...

  2. 【delphi】delphi操作sqlite3

    SQLite SQLite是一个老牌的轻量级别的本地文件数据库,完全免费且开源,不需要安装,无须任何配置,当然,这样管理功能就不是很强大了,但是它的主要应用也是在本地数据库,可以说是最简单好用的嵌入式 ...

  3. Delphi 通过SQLite3, SQLiteTable3 操作数据库

    var sql, sFile:string; db:TSQLiteDatabase;begin try sFile := G_AppPath + CH_IPC712Db; //if FileExist ...

  4. delphi Sqlite

    Delphi中SQLite如何读写二进制字段(Blob类型) 在Delphi中,有大量的组件可以操作SQLite数据库,如UniDAC就是其中一个比较优秀的,当然还有ASQLite3Component ...

  5. DELPHI XE5 与SQLITE

    最近一次使用DELPHI做项目是使用DELPHI2009,为了访问本地数据库方便,使用ACCESS数据库,不需要安装驱动,(WINDOWS自带),但是ACCESS数据库的性能确实很糟糕,通过ADO连接 ...

  6. 如何在 Delphi 中静态链接 SQLite

    搞了我几个小时,终于成功在 Delphi 中静态链接了 SQLite (v3.5.4),下一步就是研究加密了,呵呵中间其实遇到很多问题,今天累了,就不说了,改天补上 下载测试工程 下面说说方法 1.当 ...

  7. 解决delphi使用sqlite时中文最后一个字是乱码的问题

    给部门同事写了个自动生成测试用例执行情况图表的工具,使用的sqlite3,遇到中文分别使用UTF8Encode和UTF8Decode进行处理,可还是出现了某些字段从数据库中读出时,最后一个汉字是乱码的 ...

  8. Delphi资源大全

    A curated list of awesome Delphi frameworks, libraries, resources, and shiny things. Inspired by awe ...

  9. Awesome Delphi

    Awesome Delphi  A curated list of awesome Delphi frameworks, libraries, resources, and shiny things. ...

随机推荐

  1. python私有成员与公有成员(_和__)

    python并没有对私有成员提供严格的访问保护机制. 在定义类的成员时,如果成员名以两个下划线“__”或更多下划线开头而不以两个或更多下划线结束则表示是私有成员. 私有成员在类的外部不能直接访问,需要 ...

  2. 【计算机网络】Session机制

    1. Http请求中Session机制 先简单说一下HTTP请求中的Session机制:Session数据保存在服务器端,SessionID保存在客户端的Cookies中(关闭浏览器时过期).当客户端 ...

  3. (50)zabbix API二次开发使用与介绍

    zabbix API开发库 zabbix API请求和响应都是json,并且还提供了各种语法的lib库,http://zabbix.org/wiki/Docs/api/libraries,包含php. ...

  4. Linux基础学习-Postfix与Dovecot部署邮件系统

    电子邮件系统 电子邮件系统是我们在日常工作.生活中最常用的一种网络服务. 部署基础的电子邮件系统 [root@qdlinux ~]# yum install bind-chroot -y [root@ ...

  5. GIMP暗黑诱惑,部分彩色效果制作

    在一些图形处理中经常会用到高逼格的部分彩色,其他部分黑白的效果,今天我就简单记录一下如何操作. 1.选区,先选择要突出的选区,可以用多种方法,钢笔,套绳,小剪刀等等: 2.把选择的区域稍稍调整亮一点: ...

  6. jenkins学习笔记(一)

    windows下安装jenkins步骤 1.下载 官网路径:https://jenkins.io/ 2.安装 直接双击安装程序即可 centos7下安装命令: wget -O /etc/yum.rep ...

  7. 数据结构( Pyhon 语言描述 ) — —第10章:树

    树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...

  8. Python中正则表达式讲解

    正则表达式是匹配字符串的强大武器,它的核心思想是给字符串定义规则,凡是符合规则的字符串就是匹配了,否则就是不合法的.在介绍Python的用法之前,我们先讲解一下正则表达式的规则,然后再介绍在Pytho ...

  9. vs进行C#编程中常用的几个快捷键

    (1)输入svm然后按Tab键会生成Main函数: (2)Ctrl +k+s 三个键一起按,会调出代码段:选中多行后,然后按以上三个快捷键,输入需要使用的代码段,按下Tab,代码段会自动包括选中代码. ...

  10. 【10】css hack原理及常用hack

    [10]css hack原理及常用hack 原理:利用不同浏览器对CSS的支持和解析结果不一样编写针对特定浏览器样式.常见的hack有1)属性hack.2)选择器hack.3)IE条件注释 IE条件注 ...