欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

怎么样通过DB2表为Delphi产生动态的数据输入窗体

来源:本站整理 作者:佚名 时间:2016-09-04 TAG: 我要投稿

本文检查了 IBM DB2 Universal Database 的元数据,以便动态构建视图和窗体,其中包括如何动态生成新的 CLX 窗体,以及将窗体流化(stream)为 Delphi .pas 和 .xfm 文件,并准备将它们添加到 Kylix 和 Delphi CLX 项目中。
简介
 在 上一篇文章中,我检查了 IBM® DB2® Universal Database™(UDB)的元数据,以便动态构建视图和窗体。我使用了 Linux 上的 Borland® Kylix™ 3 和 dbExpress 数据访问驱动程序,来分析 IBM DB2 UDB 数据库表、字段(名称和类型),允许用户选择特定的表,来回切换应该显示的字段,以及在数据网格(datagrid)和单个数据感知控件中动态查看输出。
这次,我们将扩展该方法,以允许用户指定更加复杂的查询(例如 JOIN)。作为附加步骤,我们将产生一个单独的窗体,并以 .pas 和 .xfm 源格式保存它,因此,可以将结果窗体添加至 Borland Delphi™ 或 Kylix 项目中。这类似于原来的基于 BDE(且仅用于 Windows)的数据库-窗体向导,但这次产生的是一个跨平台的 CLX 窗体。
从 Linux 进行迁移
 上次,我完成了一个在 Linux 上运行的 Kylix 3 项目。这次,我首先需要将该项目迁移到 Windows 上,并在那里进行扩展(用以说明该项目和由此生成的 CLX 窗体是跨平台的,既可以用于 Linux 上的 Kylix,也可用于 Windows 上的 Delphi)。
将该项目从 Kylix 迁移到 Delphi 仅涉及一项更改:LibraryName 和 VendorLib 的 TSQLConnection 属性在 Linux 上被设置为 libsqldb2.so 和 libdb2.so,但在 Windows 上,该属性必须设为 dbexpdb2.dll 和 db2cli.dll。关于如何创建跨平台项目的指导,请参阅 大转变:利用 Kylix 3 从 Windows 迁移到 Linux。
添加 SQL 功能
 一旦可以在 Delphi 7 中重新打开该项目,您就可以对页面控制的 Meta Data 选项卡进行一些增强。具体地说,您需要允许用户输入 SQL 语句,而不是只能从可用表的列表中选择表名。图 1 展示了新的用户界面(显示了 EMP_PHOTO 表的字段),您可以使用左下方的 memo 字段输入 SQL 语句。
图 1. 用于 DB2 的新动态窗体
 

就在 TMemo 控件的正上方,我放置了文本 SELECT * FROM,作为小小的一个提示:用户只需指定表名,以及下面可选的 where子句。可以用代码来构造 SQL 语句,检索元数据(metadata)来获取字段名,并将这些字段名置于 TCheckListBox 中,该代码如下所示:
procedure TDBWizForm.QCheckBoxClick(Sender: TObject);
var i: Integer;
begin
if QCheckBox.Checked then begin ClientDataSet1.Active := False;
SQLDataSet1.CommandType := ctQuery;
SQLDataSet1.CommandText := 'select * from' + QMemo.Text;
SQLDataSet1.FieldDefs.Update; // get meta information
CheckListBox1.Clear;
for i:=0 to Pred(SQLDataSet1.FieldDefs.Count) do
CheckListBox1.Items.Add(SQLDataSet1.FieldDefs[i].Name)
end
end;
作为一个实际示例,我输入了一条 SQL 语句,以连接 EMPLOYEE 和 EMP_PHOTO 表,该操作是基于 EMPNO 字段的。因为已经给定了 SELECT * FROM,所以我只需要在查询 memo 字段中输入 EMP_PHOTO, EMPLOYEE WHERE EMP_PHOTO.EMPNO = EMPLOYEE.EMPNO,然后启用 Select fields from query复选框,这将执行以上代码,产生 TCheckListBox 中的字段列表。
图 2. 从查询中选择字段
 

请注意,EMPNO 字段出现了两次:一次是在 EMP_PHOTO 表中(称作 EMPNO),一次是在 EMPLOYEE 表中(然后自动称作 EMPNO_1)。
在上面的实例中,通过左下方所指定的 where子句,我从查询中选择了 PICTURE、FIRSTNME、LASTNAME、PHONENO、HIREDATE 和 SEX 字段。
为了给 DBGrid 和其他数据感知控件提供真正的数据,您需要添加一些代码,以获取表名(从 TListBox 中)或 where子句(从 TMemo 控件中)。这项决策是基于复选框的启用情况的,其编码如下:
SQLDataSet1.CommandText := 'SELECT ';
comma := False;
for i:=0 to Pred(CheckListBox1.Items.Count) do
begin
if CheckListBox1.Checked[i] then
begin
if not comma then comma := True
else
SQLDataSet1.CommandText :=SQLDataSet1.CommandText + ', ';
SQLDataSet1.CommandText := SQLDataSet1.CommandText + CheckListBox1.Items[i]
end
end;
if QCheckBox.Checked then
SQLDataSet1.CommandText := SQLDataSet1.CommandText + ' FROM ' + QMemo.Text
else if
ListBox1.ItemIndex >= 0 then SQLDataSet1.CommandText := SQLDataSet1.CommandText
+ ' FROM ' + ListBox1.Items[ListBox1.ItemIndex];
这确保您可以使用带有表名的 TListBox,或使用带有 SQL where 子句的 TMemo ,来选择字段并为视图产生数据。
添加更多的控件
 您在图 2 中选择的字段是 PICTURE 字段。上次,我在由 TDBMemo 表示的 Memo 字段之间进行了区分,虽然其他所有字段都是由 TDBEdit 表示的。对于可以是 ftGraphic 或 ftBlob(本实例中)的 image 字段,您可以使用 TDBImage 控件。请注意,ftBlob 的情况并不是百分之百确定的:大多数 BLOB 字段只包含二进制数据,而不是总包含图像。但是对于本例,ftBlob PICTURE 字段包含图像(以不同的格式,如 bmp 或 gif)。
必须添加一些附加代码,以检测字段类型,并通过动态创建 TDBImage 对此作出响应,这些附加代码片断如下所示:
if (ClientDataSet1.FieldDefs[i].DataType = ftGraphic) or (ClientDataSet1.FieldDefs[i].DataType = ftBlob) then

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载