分享

Delphi中使用SQLite3(一)

 A芝兰之室 2017-10-22


        SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

       SQLite的最新版本是SQLite3,官网http://www./,听说SQLite3还可以当内存数据库,特地研究一下。SQLite3的基本使用,我这边就不再介绍,网上很多,大家可以参考http://yuanzhifei89./blog/1123870这篇文章。

       SQLite3,用C语言编写,有给C++提供很方便的类库,但是Delphi却不能使用,但是总有Delphi牛人把SQLite3的API封装了一下,方便Delphi调用。我使用的封装类是sqlite simple delphi,SQLite3官网上面还有很多其它的封装类,有兴趣的可以研究一下,http://www./cvstrac/wiki?p=SqliteWrappers

       sqlite simple delphi的官网网站是http://www./blog/?page_id=659,下载下来以后是一个压缩包里面是一个demo。咱们需要里面的两个文件。SQLite3.pas 跟 SQLiteTable3.pas ,把他们复制到工程目录下面,然后在需要操作库的单元文件里面 uses SQLiteTable3 。

[delphi] view plain copy
  1. procedure TForm1.btnTestClick(Sender: TObject);  
  2. var  
  3. slDBpath: string;  
  4. sldb: TSQLiteDatabase;  
  5. sltb: TSQLIteTable;  
  6. sSQL: String;  
  7. Notes: String;  
  8.   
  9. begin  
  10.   slDBPath := ExtractFilepath(application.exename)+ 'test.db';  
  11.   sldb := TSQLiteDatabase.Create(slDBPath);  
  12.   try  
  13.     if sldb.TableExists('testTable') then  
  14.     begin  
  15.       sSQL := 'DROP TABLE testtable';  
  16.       sldb.execsql(sSQL);  
  17.     end;  
  18.   
  19.     sSQL := 'CREATE TABLE testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,';  
  20.     sSQL := sSQL + '[Name] VARCHAR (255),[Number] FLOAT, [notes] BLOB, [picture] BLOB COLLATE NOCASE);';  
  21.   
  22.     sldb.execsql(sSQL);  
  23.   
  24.     sldb.execsql('CREATE INDEX TestTableName ON [testtable]([Name]);');  
  25.   
  26.     //begin a transaction  
  27.     sldb.BeginTransaction;  
  28.   
  29.     sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Some Name",4,587.6594,"Here are some notes");';  
  30.     //do the insert  
  31.     sldb.ExecSQL(sSQL);  
  32.   
  33.     sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Another Name",12,4758.3265,"More notes");';  
  34.     //do the insert  
  35.     sldb.ExecSQL(sSQL);  
  36.   
  37.     //end the transaction  
  38.     sldb.Commit;  
  39.   
  40.     //query the data  
  41.     sltb := slDb.GetTable('SELECT * FROM testtable');  
  42.     try  
  43.   
  44.       if sltb.Count > 0 then  
  45.       begin  
  46.         //display first row  
  47.   
  48.         ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']);  
  49.         ebID.Text := inttostr(sltb.FieldAsInteger(sltb.FieldIndex['ID']));  
  50.         ebNumber.Text := floattostr( sltb.FieldAsDouble(sltb.FieldIndex['Number']));  
  51.         Notes :=  sltb.FieldAsBlobText(sltb.FieldIndex['Notes']);  
  52.         memNotes.Text := notes;  
  53.   
  54.       end;  
  55.   
  56.     finally  
  57.       sltb.Free;  
  58.     end;  
  59.   
  60.   finally  
  61.     sldb.Free;  
  62.   end;  
  63. end;  
当数据库的路径包含中文的时候,使用sqlitetable3就打不开数据库了,我把sqlitetable3的源码改动了一下,中文路径就能正常识别了。

修改后的SQLite3.pas 跟 SQLiteTable3.pas下载地址


当SQLite3作内存数据库时,只需要将数据库路径改成“:memory:”即可,其它的操作如创建表、查询表都是和操作本地数据库一样的,如下:

[delphi] view plain copy
  1. SqlDb := TSQLiteDatabase.Create(':memory:');  


我编写的Delphi使用SQLite3的Demo,包括本地数据库和内存数据库,本地数据库加载到内存,内存数据库备份到本地,下载地址


用记事本打开sqlite3的数据库文件,发现之前我们插入的数据都能看到,几乎都是明文显示的,这很明显是不满足我们要求的。请关注下一篇文章,关于SQLite3的加密。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多