用Delphi开发数据库程序经验三则

用Delphi开发数据库程序经验三则,第1张

一 建立临时表 数据输入是开发数据库程序的必然环节 在Client/Server结构中 客户端可能要输入一批数据后 再向服务器的后台数据库提交 这就需要在本地(客户端)建立临时数据表来存储用户输入的数据 待提交后 清除本地表数据 这种方法的好处是 提高输入效率 减小网络负担

由于用户一次输入的数据量一般情况下较小(不会超过几百条记录) 所以临时表可以建立在内存中 这样处理速度较快 方法 使用查询控件(TQuery)第 步 在窗体上放上查询控件(TQuery) 设置好所连接的数据表 第 步 使 TQuery CachedUpdates=True TQuery RequestLive=True第 步 在原有的SQL语句后加入一条Where子语句 要求加入这条Where子语句后SQL查询结果为空 例如 SELECT Biolife ″Species No″ Category Common_Name Biolife ″Species Name″ Biolife ″Length (cm)″ Length_In Notes Graphic FROM ″biolife db″ Biolifewhere Biolife Category=′A′ and Biolife Category=′B′这样临时表就建立完成了

方法 使用代码创建临时表代码如下 function CreateTableInMemory(const AFieldDefs:TFieldDefs):TDataSetvar TempTable:TClientDataSetbegin TempTable:=nilResult:=nilif AFieldDefs<>nil then begin try TempTable:=TClientDataSet Create(Application)TempTable FieldDefs Assign(AFieldDefs)TempTable CreateDataSetResult:=(TempTable as TDataSet)Except if TempTable<>nil then TempTable Free

  Result:=nilraise    endend end

在程序中按如下方法使用 procedure TForm Button Click(Sender: TObject)var ADataSet:TDataSetbegin ADataSet:=TDataSet Create(Self)with ADataSet FieldDefs do begin Add(′Name′ ftString False)Add(′Value′ ftInteger False)end

with DataSource do begin DataSet:=CreateTableInMemory(ADataSet FieldDefs)DataSet Openend

ADataSet Freeend

临时表创建完成

方法 使用简单 但由于利用查询控件 清空数据时需要查询服务器后台数据库 所以速度稍慢 而且不适用于临时表中各个字段由数个数据表的字段拼凑而成的情况 方法 适用范围广 速度快 但需要编写代码 (代码中TFieldDefs的使用方法十分简单 见Delphi的联机帮助)

二 配置数据引擎(BDE SQL Link)  有关数据库程序分发时 需要携带数据引擎(BDE SQL Link) 并且在客户端安装完程序后还需要配置数据引擎 如用户名(username) 密码(Password)等等 如果手工配置的话 工作量比较大(根据客户机数量而定) 而InstallShield For Delphi又好像没有这方面的选项 其实InstallShield For Delphi可以做到 在生成安装程序的目录里有一个* iwz的文本文件 只要在[IDAPI Alias]片段中手工加入即可 例如 [IDAPI Alias] usesname=SYSDBA password=masterkey 安装程序后数据引擎自动配置完毕

三 在InterBase数据库中使用函数 程序员可能在用InterBase作为后台数据库时 会为其提供的函数过少而感到不方便(只有四个) 无法方便地编写出复杂的存储过程 InterBase本身无法编写函数 但它可以使用外部函数(调用DLL中的函数) 下例中说明如何在InterBase 中声明SUBSTR函数 DECLARE EXTERNAL FUNCTION SUBSTR CSTRING( ) SMALLINT SMALLINT RETURNS CSTRING( ) ENTRY_POINT ″IB_UDF_substr″ MODULE_NAME ″ib_udf″

其中 MODULE_NAME为DLL的名称 ENTRY_POINT为函数名 声明后便可以使用 例如   select SUBSTR(country) from country

lishixinzhi/Article/program/Delphi/201311/8520

Visual Query Builder 以可视化的方式建立SQL语句对数据库表和表中的记录进行 *** 作

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

SQL links使得Delphi数据库应用程序利用SQL语言访问驻留在远程服务器上的数据 这些服务器包括ORACLE Sybase Microsoft SQL Server Informix InterBase 当安装SQL Link驱动程序之后 SQL语句便可以直接 *** 作服务器上的数据

Delphi可以访问的数据源(DataSource)

Delphi数据库应用程序是通过BDE获取它们所需的数据的 BDE与不同类型的数据源打交道 BDE可以使用的数据源有如表 所示

表 Delphi可访问的数据源

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

数据源(DataSource)   特 性 描 述  文件扩展名

─────────────────────────────────────

dBASE数据库  数据库表是通过dBASE数据库管理系统或DBD建立的 每个表是一个独立的文件  DBF

─────────────────────────────────────

Paradox数据库  数据库表是通过Paradox数据库管理系统  DB或DBD建立的 每个表是一个独立的文件

─────────────────────────────────────

ASCII文件  表是通过Database Desktop建立的 每个  TXT表是一个独立的文件

─────────────────────────────────────

本地InterBase服务器  数据库是通过InterBase数据库管理系统  GDB建立的 多个表包含在一个数据库文件中

─────────────────────────────────────

SQL数据库服务器   数据库是通过相应的数据库服务器提供的 依赖不同的ORACLE Sybase Informix 专用或通用工具建立的 也可以通过DBD来 数据库管理Microsoft SQL Server  创建数据库 并通过SQL Link访问数据库  系统InterBase

─────────────────────────────────────

ODBC数据源  主要是指那些具有ODBC接口的数据库系统 依赖于相应如MS Access Btrieve等的数据库

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Delphi数据库的体系结构

Delphi使用可视化的部件创建数据库应用 跟创建其它的非数据库应用程序一样 数据库部件都具备一定的属性 程序设计人员可以在设计过程中设置部件的多种属性 也可以在程序运行过程中通过程序来设置部件的各种属性

在Delphi部件板上有两页数据库部件用于开发数据库应用程序

数据访问部件页 该页上的部件主要用于说明有关的数据库的信息 如应用程序要访问(连接)的数据库 要访问数据库中的具体的数据库表 以及要访问表中哪些字段等 在实际的开发应用中常用的部件有TDataSource TTable TQuery等

数据控制部件页 该页上的部件主要用于显示浏览数据库中的数据信息 为用户提供了一个可视化的界面 常用的部件有 TDBGrid TDBEdit TDBCheck等 可以让用户对数据库中的信息进行有效的浏览 编辑 插入 删除等 *** 作

TTable TQuery TStoredproc部件负责与实际的数据库表联系 并从中获取数据信息 因而它们又常常被称为数据集部件 它们在程序设计过程中是可见的 但在程序运行时是不可见的 它们通过 BDE 为应用程序提供与数据库的连接 数据控制部件通过TDataSource部件与数据集部件相连 为用户提供一个可视化的界面 并在其中显示数据库中的数据信息

数据访问部件

数据访问部件页上提供了一组数据访问部件用来访问数据库中的数据

当要创建一个数据库应用时 首先在窗体中选择一个数据访问部件 然后为数据访问部件设置有关的属性 说明要访问的数据库 数据表以及表中的记录等 数据访问部件为数据控制部件与数据源建立一条通道 数据访问部件在程序运行时是不可见的 下表列出了数据访问页上的数据访问部件以及它们的主要用途

表 数据访问部件

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

部件名称   主 要 用 途

────────────────────────────

作为数据集部件TTable TQuery StoredProc组TDataSource 件与数据浏览件TDBGrid TDBEdit之间传送数据的通道

────────────────────────────

TTable  它是存取磁盘上数据库表的媒介 它通过BDE存取数据库表中的数据 TTable再与TDataSource进行 对话 使得数据浏览部件能够有效地从TTable中访问数据并能显示和编辑其中的数据

────────────────────────────

TQuery  它利用SQL语言访问磁盘上数据库表中的数据 并与TDataSource 对话 实现数据浏览部件对数据库的访问

────────────────────────────

TStoredProc 在应用程序中 它主要用来访问远程服务器中的存贮过程

────────────────────────────

TDatabase  当应用程序要登录到一个远程服务器上的数据库时 可以用该部件来建立应用程序与数据库永久

性的连接

────────────────────────────

TBatchMove 用于复制数据库表的结构或表中的记录

────────────────────────────

TReport  用于创建数据库的输出报表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

lishixinzhi/Article/program/Delphi/201311/25180

内建的Bold对象编辑界面

双击BoldGrid中左侧的箭头 或者记录可以激活对象编辑对话框 对象编辑对话框可以同时启动多个 如下图所示意

在BoldGrid中 我们可以使用ctrl+鼠标点击来多选对象 也可以点击网格左上角来选中所有的对象 但是默认的BoldGrid对象编辑器不支持人员和账目对象的关联的显示和编辑 但d出的对象编辑器则支持这些关联 上图框起来的箭头 可以用来拖放对象 将哈巴狗拖动到PayPerson的位置 就可以建立支付人同账目对象之间的关联了

还有一点要注意的是d出式对象编辑器并不是同Grid同步绑定的 因此我们可以打开多个编辑器的同时还可以在网格内的记录间导航到不同的位置 两者可以做到互不影响游标 而传统的数据库程序无法做到这点 因为当游标改变时 会同步改变所有同DataSource绑定的数据感知组件中的内容

退出系统后 可以看到Data xml中记录了刚才输入的信息

主从关系的实现

使用上面的Bold程序 再输入一个大尾巴兔兔的用户 你会发现有一个问题 就是大尾巴兔兔同志目前没有任何账目支出 但是点选到大尾巴兔兔对象上时 账目网格组件仍然是显示所有的账目信息 而没有实现主从关联

为了实现主从关系 需要修改一下账目对象的BoldListHandle组件的属性 将blhAcct的RootHandle属性由原来的DmMoney bshMoney改成blhPerson 表示父对象是人员 同时要将Expression属性改成Pay 另外为了能够在账目网格中显示同账目关联的人员信息 双击bgAcct网格 添加一个新的Column 设定它的BoldProperties Expression为PayPerson name 表示字段用来显示支付账目人的名字 见下图示意

再次运行程序 可以看到这回实现了真正的主从关联 当点击哈巴狗时 只显示同哈巴狗关联的账目 同时 如果这时点击账目网格的添加命令的话 新建的对象的PayPerson自动设定为哈巴狗 如下图示意

级联删除的实现

前面虽然我们实现了主从关系 但是将所有人员都删除后 你会发现data xml文件中仍然有账目信息 这表明 删除人员时 没有将同人员绑定的账目信息删除 也就是说并没有实现级联删除

为了更形象的察看这一现象 在界面添加一个BoldGrid BoldNavigator和BoldListHandle来显示系统中所有的对象 设定BoldListHandle的RootHandle属性为DmMoney bshMoney 设定Expression属性为MoneyModelRoot allInstances表示显示系统中所有的对象实例

然后向前面一样将BoldListHandle绑定到BoldGrid和BoldNavigator 并创建默认的Columns 再次运行后的效果如下图所示意

可以看到全部对象列表中有两个字段 type字段表示系统中对象的类型 而AsString字段则显示对象的字符串表达 但是默认Person对象的AsString字段里面显示的是对象组件加类别字符串 而AcctItem对象的AsString显示的是对象的Amount属性 但是为了观察对象被删除的情况 我希望能够显示更有意义的字符串 如显示人员的名称 显示账目的名称及支付人

因此需要修改模型中对象默认字符串的定义 双击数据模块中bmMoney 激活Bold UML Editor 选中Person对象 设定Default string rep为name 表示默认的AsString属性为人员的名称 见下图示意

同样的 设定AcctItem的Default string rep为payPerson name+ +name 表示AsString由支付人的名称及账目名称构成

再次运行程序 显示效果示意如下

这时 将哈巴狗从人员列表中删除后 界面示意图如下

可以看到账目对象大白菜和化妆品仍然还在 只是支付人信息为空了 看来账目对象确实没有被级联删除 为了实现级联删除 再次打开Bold UML Editor 展开PayAssoc关联 选中Pay 然后设定Delete action为Cascade 表示使用级联删除 见下图示意

再次运行程序 输入人员信息及人员账目信息后 再删除人员 会发现这回将绑定的账目信息也一同删除了

总结

lishixinzhi/Article/program/Delphi/201311/24783


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9952359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存