之前玩 Delphi,数据库部分,用得最多的是 TClientDataSet。这个 TClientDataSet 有很多玩法,重点是它可以作为一个独立的内存表,无论数据来自什么数据库都支持,并且可以把内容保存为文件,也可以把内容通过远程传递。
新的 Delphi,TClientDataSet 还在,但有了新的 FireDAC 的整套数据库访问控件,它也包含一个 TDfMemeTable 内存表控件。这个内存表控件该如何使用?比如,来自数据库的数据,该如何放进去?
开始学习 FireDAC 的玩法。这里大概会写一个系列。
今天来个简单的:
--------------------------------------------------------------
开始测试
新建一个 VCL 工程。拖几个 FireDAC 的控件过来。
1. FDConnection1 用来连接数据库;我这里使用 FireBird 数据库,我自己在硬盘上创建了一个测试用的 FireBird 数据库。双击它会弹一个窗口出来,在里面可以对它要连接的数据库进行一些参数设置。参数设置正确,就可以成功连接数据库了。
2. FDQuery1,它的 Connection 属性指向 FDConnection1,这样它就可以访问对应的数据库里面的表。
2.1. FDQuery1 的 SQL 属性里面填写:select * from TAB_AUTO;这里的 TAB_AUTO 是我的测试用的数据库里面我自己建立的一个表的名字。到这里,如果一切顺利,在设计期,可以打开 FDQuery1 成功。如果有问题,查一下数据库连接的属性设置里哪个地方没做对。
3. 拖一个 FDMemTable1 到界面上;再拖一个 DataSource1 到界面上,其 DataSet 属性指向 FDMemTable1;
4. 拖一个 DBGrid1 到界面上,其 DataSource 属性指向 DataSource1;这样,当 FDMemTable1 里面有数据的时候,可以从 DBGrid1 看到。
5. 拖一个 FDGUIxWaitCursor1 到界面上,否则 FireDAC 在打开数据库的时候,会冻结界面。
6. 拖两个按钮到界面上,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
FdQuery1.Open();
end;
procedure TForm1.Button2Click(Sender: TObject);
var
AStream: TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
FdQuery1.SaveToStream(AStream);
AStream.Position := 0;
FdMemTable1.LoadFromStream(AStream);
finally
AStream.Free;
end;
end;
Button1 的代码就是打开 FdQuery1,也就是从数据库获取数据;
Button2 的代码是把 FdQuery1 的数据,输出给 FdMemTable1;
运行程序,先点 Button1,没有任何出错信息,说明成功;再点 Button2,出来一个异常:
根据上述异常提示,我去控件面板里面,找到一个控件:FDStanStorageBinLink1 拖过来放到界面上,再次运行,成功。
以下是正确的设计期的界面控件:
以下是点了【取数据】也就是 Button2 以后的执行成功的结果:
总结:
1. FireDac 的 TDataSet 要输出数据,采用 FdQuery1.SaveToStream(AStream); 的方法,但必须要拖一个 FDStanStorageBinLink1 到界面上,否则会出异常。在控件面板的 FireDAC Links 里面,还要诸如 FDStanStorageXMLLink1 等 Link,也就是说,要输出为其它格式比如 XML 也需要拖一个对应的 Link 控件过来;
2. 上述代码里面有:AStream.Position := 0;,如果没有这句,则执行 FdMemTable1.LoadFromStream(AStream); 会出现异常提示。这里说明 LoadFromStream 方法是从 AStream 的当前位置开始的。