加载中…
个人资料
独行者
独行者
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,730
  • 关注人气:11
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Delphi 中 SQLite 如何读写二进制字段(Blob类型)

(2011-04-27 17:56:39)
标签:

杂谈

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

首先建一个表,字段类型为BLOB

SL.Add('CREATE TABLE IF NOT EXISTS TEST (');
SL.Add('FileName TEXT PRIMARY KEY,');
SL.Add('Data BLOB);');
SL.Add('');
写入二进制数据:

var
  FFileStream:TFileStream;
  FData:array of Char;
  FSQLR:TSQLRequest;
  ASQL:AnsiString;
begin
  FFileStream:=TFileStream.Create('test.xml',fmOpenReadWrite);
  ASQL:='INSERT INTO TEST(FileName,Data) VALUES('+QuotedStr('test.xml')+',?)';
  try
    SQLite数据库对象.Execute('DELETE FROM TEST');
    //
    SetLength(FData,FFileStream.Size);
    FFileStream.Position:=0;
    FFileStream.Read(PChar(FData)^,Length(FData));
    FSQLR.Prepare(SQLite数据库对象.DB,ASQL);
    FSQLR.Bind(1,PChar(FData),Length(FData));
    FSQLR.Execute;
  finally
    FreeAndNil(FFileStream);
  end;

其中问号是参数,SQLite数据库对象类型为TSQLDataBase

读取数据并写入到文件:

var
  FBlobField:TSQLBlobStream;
  FFileStream:TMemoryStream;
  FData:array of Char;
begin
  try
    FFileStream:=TMemoryStream.Create;
    FBlobField:=SQLite数据库对象.Blob('','TEST','Data',1,True);
    try
      FBlobField.Position:=0;
      SetLength(FData,FBlobField.Size);
      FBlobField.ReadBuffer(PChar(FData)^,FBlobField.Size);
      FFileStream.Write(PChar(FData)^,FBlobField.Size);
      FFileStream.SaveToFile("test.xml");
    finally
      FreeAndNil(FBlobField);
      FreeAndNil(FFileStream);
    end;
  except
    Result:='';
  end;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有