FireDAC 和 Sqlite 八:Blob类型数据的插入和读取

0051.jpg


Firedac是Delphi开发跨平台的数据库应用程序的通用数据访问组件,同样适用于C++ Builder和FreePascal。这里是Firedac操作Sqlite的学习笔记。文中代码在Delphi 11中编译通过。

先将“FireDAC 和 Sqlite 一 :基本控件和设置”一篇中提到的常用控件加入Form,并做好关联。

再按照“FireDAC 和 Sqlite 二:创建数据库和表”一篇中介绍建立数据库和表。


例子一:把内存流写入数据库后,再读出到另一个内存流,进行比对

procedure TForm1.Button1Click(Sender: TObject);
var
    stm1,stm2:TmemoryStream;
    Buf:TBytes;
const
    Data: Array[0..2] of byte =(200,201,202);
begin
    //初始化
    SetLength(Buf,3);
    stm1:=TmemoryStream.Create;
    stm2:=TmemoryStream.Create;
    stm1.Write(Data,3);//把Data数据写入stm1
    
    //插入
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text :='INSERT INTO MyTable(Name, Age,Picture) VALUES(:name, :age, :Picture)';
    FDQuery1.ParamByName('Name').AsString := 'Tom';
    FDQuery1.ParamByName('age').AsByte := 12;
    FDQuery1.ParamByName('Picture').LoadFromStream(stm1,ftBlob ,-1);//数据从stm1写入数据库
    FDQuery1.ExecSQL;
    FDQuery1.Open('SELECT * FROM MyTable');//如果是修改打开的表,改完要重新打开
    
    //读取
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text := 'SELECT * FROM MyTable WHERE Age = :x';
    FDQuery1.ParamByName('x').AsInteger := 12;
    FDQuery1.Open();
    TBlobField(FDQuery1.FieldByName('Picture')).SaveToStream(stm2);//数据读出到stm2
    //TBlobField(FDQuery1.FindField('Picture')).SaveToStream(stm2);//与上同
    stm2.position:=0;//重新定位
    stm2.Read(Buf,3);//把stm1数据写入Buf
    
    //显示比对
    Memo1.Text:=FDQuery1.FieldByName('Name').AsString;
    //Memo1.Text:=FDQuery1.FindField('Name').AsString;//与上同
    Memo1.Lines.Add(inttostr(Buf[0]));
    Memo1.Lines.Add(inttostr(Buf[1]));
    Memo1.Lines.Add(inttostr(Buf[2]));
    
    //释放内存流
    stm1.Free;
    stm2.Free;
end;


例子二:把内存流写入数据库后,再以数组的形式读出,进行比对

procedure TForm1.Button20Click(Sender: TObject);
var
    stm1:TmemoryStream;
    Buf:TBytes;
const
    Data: Array[0..2] of byte =(200,201,202);
begin
    //初始化
    SetLength(Buf,3);
    stm1:=TmemoryStream.Create;
    stm1.Write(Data,3);//把Data数据写入stm1
    
    //插入
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text :='INSERT INTO MyTable(Name, Age,Picture) VALUES(:name, :age, :Picture)';
    FDQuery1.ParamByName('Name').AsString := 'Tom';
    FDQuery1.ParamByName('age').AsByte := 12;
    FDQuery1.ParamByName('Picture').LoadFromStream(stm1,ftBlob ,-1);//数据从stm1写入
    FDQuery1.ExecSQL;
    FDQuery1.Open('SELECT * FROM MyTable');//如果是修改打开的表,改完要重新打开
    
    //读取
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text := 'SELECT * FROM MyTable WHERE Age = :x';
    FDQuery1.ParamByName('x').AsInteger := 12;
    FDQuery1.Open();
    Buf:=FDQuery1.FindField('Picture').AsBytes;
    
    //显示比对
    Memo1.Text:=FDQuery1.FindField('Name').AsString;
    Memo1.Lines.Add(inttostr(Buf[0]));
    Memo1.Lines.Add(inttostr(Buf[1]));
    Memo1.Lines.Add(inttostr(Buf[2]));
    
    //释放内存流
    stm1.Free;
end;


标签:DelphiFireDAC

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://evelee.net/blog/?id=74