zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    servlet的配置
    getRequestDispatcher()与sendRedirect()的区别
    request.setAttribute()怎么用的?
    <jsp:useBean>元素使用全解
    jsp中使用javabean简单例子
    2-1
    跟我想的一样,已经连续暴跌三天了。
    我的判断很正确
    我靠算个账发现最近打德扑输了好多钱啊,怀疑PokerStars里是不是有好多机器人作弊骗钱呢???
    1-18
  • 原文地址:https://www.cnblogs.com/plug/p/4557212.html
Copyright © 2011-2022 走看看