Delphi数据库控件使用入门(一)

Delphi数据库控件使用入门(一),第1张

数据库应用程序中 数据控件是经常要用到的 数据控件都是可视的 也就是说 如果修改了这些构件的属性 能在窗体上马上反映出来 如果这些构件的Enabled属性设为True并且数据集的Active属性也设为True 在设计期就可以看到数据

下面就来介绍一下这些控件的简单应用

指定一个数据源

数据控件必须通过TDataSource构件连接数据集 TDataSource构件扮演的角色实际上就是数据控件与数据集之间的桥梁 首先 把一个数据集构件放到窗体或数据模块上 设置它的DatabaseName属性指定要访问的数据库 设置它的TableName属性指定要访问的表 接着 把一个TDataSource构件放到窗体或数据模块上 设置它的DataSet属性指定数据集 然后 把一个数据控件放到窗体上 设置它的DataSource属性指定TDataSource构件 而这个TDataSource构件的DataSet属性已经指定了一个数据集 最后 设置数据控件的DataField属性指定要显示的字段 不过 对于TDBGrid TDBCtrlGrid和TDBNavigator构件来说 不需要设置DataField属性 因为这几个控件是以整个数据集为工作内容的

编辑和更新数据

除了TDBNavigator构件外 其他数据控件都是用来显示和编辑数据的 这里要介绍怎样编辑数据

要使用户能编辑数据 数据集必须进入dsEdit状态 如果TDataSource的AutoEdit属性设为False 用户不能直接编辑数据 除非程序调用Edit函数

要使用户能够在数据控件中修改数据 必须把数据控件的ReadOnly属性设为False 如果ReadOnly属性设为True 数据控件中显示的数据就是只读的 一般情况下 TDataSource构件的Enabled属性设为True 如果这个属性设为False 数据控件就无法显示数据 更不能修改数据

如果数据集构件的ReadOnly属性设为True 数据集就是只读的 用户在数据控件中所作的修改不能写到数据集中 除了TDBGrid构件外 当用户修改了一个字段的值 还需要把输入焦点移走 新的数据才写到数据集中 在移走输入焦点之前 用户随时可以按ESC键取消修改 在TDBGrid构件建立的栅格中 当用户修改了一个字段的值 还需要把输入焦点移到另一条记录上 新的数据才写到数据集中

禁止和允许数据刷新

当程序正在遍历整个数据集或者搜索一个特定的记录时 应当暂时禁止数据控件刷新数据 这样能加快遍历或搜索的速度 防止屏幕总是在闪烁 调用数据集的DisableControls可以暂时禁止连接这个数据集的数据控件刷新数据 DisableControls函数通常在循环 *** 作前调用 等循环结束后 程序应当立即调用数据集构件的EnableControls函数重新允许刷新数据 为了确保最后总是能恢复刷新 建议采用Try Finally结构 这样 即使在循环中出现异常 也可以保证总能调用EnableControls

下面的代码演示了怎样调用DisableControls和EnableControls函数

CustTable DisableControls;TryCustTable First;While not CustTable EOF DoBegin CustTable Next;End;FinallyCustTable EnableControls;End;

手动刷新数据

调用数据集的Refresh可以读取数据集中最新的数据并刷新数据控件 这个功能在多用户环境尤其有用 因为其他用户有可能已改变了数据集中的数据 有时候 调用Refresh可能会导致意想不到的结果 例如 如果另一个用户已经删除了一条记录 调用Refresh后 这条记录将从数据控件中消失

显示单个字段的数据控件

有的数据控件以数据库的一个或几个字段作为工作内容 如TDBText和TDBEdit 而有的数据控件以整个数据集为工作内容 如TDBGrid和TDBNavigator 显示单个字段的数据控件往往是从一个标准的Windows控件演化而来的 例如 TDBEdit构件就可以认为是TEdit的数据感知版本

把数据作为标签显示

TDBText构件是一个只读的数据控件 它非常类似于TLabel构件和TStaticText构件 TDBText构件能够把数据作为标签显示 用来标注其他控件 例如 可以用一个TDBText构件显示名称(Common_Name字段)

TDBText构件需要指定一个字段 当用户使用导航器或其他手段浏览记录时 TDBText构件显示的数据将自动变化 因为TDBText构件总是显示当前记录的数据

TDBText构件的AutoSize属性一般要设为True 这是因为字段的内容长度可能是不同的 如果AutoSize属性设为False 有些较长的内容可能会被截断

显示和编辑数据

TDBText构件只能显示数据 不能编辑数据 要既能显示数据 又能编辑数据 就要用到TDBEdit构件 TDBEdit可以认为是TEdit的数据感知(Data Aware)版本 例如 有一个TDataSource构件叫CustomersSource 它的DataSet属性指向一个TTable构件叫CustomersTable 把一个TDBEdit构件放在窗体上 其DataSource属性设为CustomersSource 把它的DataField属性设为CustNo 这个TDBEdit构件马上就能显示CustNo字段的值 用户可以在编辑框中键入新的值

显示和编辑多行文本

TDBMemo构件是TMemo构件的数据感知版本 可以显示dBASE和Paradox数据库中备注字段的内容

与TDBEdit不同的是 TDBMemo能够以多行的形式显示文本 同时也允许用户键入多行文本

默认情况下 TDBMemo允许用户修改它显示的文本 如果不想让用户修改文本 只要把ReadOnly属性设为True即可

要允许用户在文本中插入一个制表符 应当把WantTabs属性设为True 否则 当用户按下Tab键 将把输入焦点移走 而不是插入制表符 要限制用户最多可输入的字符数 可以设置MaxLength属性 如果这个属性设为 表示没有限制

此外 ScrollBars属性可以设置要不要加上滚动栏 WordWrap属性可以设置是否允许自动绕回 Alignment属性可以设置文本的对齐方式 在运行期 您可以调用CutToClipboard和CopyToClipboard函数把选择的文本剪切和复制到剪贴板中 调用PasteFromClipboard能够粘贴剪贴板中的文本

lishixinzhi/Article/program/Delphi/201311/8453

增加字段部件

字段编辑器Fields Editor中的Add Fields菜单项用于向数据集部件中增加字段部件的 单击Add Fields菜单项时便会打开增加字段部件对话框 如图 所示 Available Fields列表框中显示出数据集部件TTable或TQuery中当前可以用于创建永久字段部件的全部的字段 也就是说Available Fields列表框中显示字段是数据库表中实际存在的字段 而且还没有为这些字段创建相应的永久性的字段部件 在缺省状态下所有的字段都被选择用于创建相应的永久性的字段部件 用鼠标单击其中的字段名可以有选择地创建其相应的永久性的字段部件 选择好有关的字段名之后 单击OK按钮便可以创建永久性的字段部件

字段编辑器的增加字段部件对话框

删除字段部件

用字段编辑器Fields Editor为数据集部件创建好的字段部件都会显示在字段编辑器的Fields列表框中 如果用户认为其中的一些字段部件不合适或不再需要时 可以单击这些不需要的字段部件 然后单击鼠标右键d出一佣d出式菜单 从d出式菜单中选择Delete菜单项 便可删除相应的字段部件 如果在d出式菜单中单击Select All菜单项 然后选择Delete菜单项 这样会删除已创建好的所有的字段部件 某一个字段部件被删除以后 通过单击Add Fields菜单项可以重新创建 只是先前为该字段部件设定的一些属性将不复存在

定义新的字段部件

字段编辑器Fields Editor中的d出式菜单中New Fields菜单项是用来为数据集部件TTable或TQuery创建用于显示目的的新的字段部件 我们可以用它来为数据库表中实际存在的字段创建新的字段部件(如改变字段的数据类型 使它的字段值被显示时不再需有关的类型转换) 但是我们使用New Fields菜单项创建新的字段部件主要是创建计算字段 计算字段并不与数据库表中实际存在的字段对应 它的字段值是根据表中其它的字段值计算而来的 具体的计算表达式由用户为TTable部件或TQuery部件的OnCalCFields事件编写程序代码时决定

定义(创建)计算字段的过程如下

单击字段编辑器中的New Fields菜单项 定义字段对话框如图 所示

在FieldName编辑框中输入新字段部件的名字 或者从下拉式列表框中选择一个已存在的字段部件的名字

在FieldType列表框中为新字段部件选择一个字段类型

单击Calculated检查框 确认定义的新字段部件是计算字段

单击ok按钮 创建上述定义的计算字段部件 此时该字段部件的名字会自动地加入到字段编辑中的Fields列表框中

创建新的计算字段

新的计算字段创建好了之后 它是没有任何字段值的 我们必须要编写相应的程序代码 根据数据库表中实际存在的字段的字段值为计算字段的宝定义字段值 我们为计算字段所在数据集部件的OnCalcFields事件编写代码来为计算字段赋值 其步骤如下

选择数据集部件TTable或TQuery

单击数据集部件的事件页

双击OnCalcFields事件为TTable或TQuery部件编写事件处理过程

TReport部件及其应用

在一般的数据库应用程序中都包含着为最终用户提供输出报表的功能 使用Delphi开发数据库应用程序时 可以使用一个叫TReport的部件来执行报表功能的 报表的具体格式和内容是由Delphi提供的一个专用报表生成工具ReprotSmith创建的 它报表的具体格式和内容生成一个报表文件 然后为TReport部件设置相应的属性参数 由TReport部件执行报表功能

我们可以在设计阶段双击TReport部件 调用ReportSimith工具或者在Delphi程序组内双击ReportSmith图标来调用ReportSmith工具来创建一个报表文件 具体的 *** 作步骤和设计方法请参看ReportSimth工具的使用说明

我们在使用TReport部件执行报表功能时 要设置TReport部件的一些的一些属性 这些属性是

ReportName属性 说明报表文件的名字 就是用ReportSmith创建的报表文件

ReportDir属性 说明报表文件所在的途径名

PreView属性 这是一个布尔型属性 若它的值为True 那么在执行报表功能时 只是在屏幕上显示报表 若它的值为False 则报表内容将在缺省的打印机打印出来

AutoUnload属性 布尔型属性 它的值为True时 在执行完一个报表功能后 自动地从内存中卸出ReportSmith工具 它的值为False时 在运行完一个报表功能后 不从内存中卸出ReportSmith工具 一般情况下 如果应用程序只有一个报表或者只有较少的报表要输出时 应设置AutoUnload属性为True 如果应用程序一次要输出多个报表 那么要应设置AutoUnload属性为False

InitialValues属性 这是一个字符串类型的属性 它是说明报表文件中使用的变量 每一条说明一个变量 如

ReportVAR := Value;

要详细了解创建和使用报表变量的过程请参看创建报表一节

TReport部件要真正执行报表功能以输出一个报表需要调用Run方法 如下所示

Report Run;

TReport部件所具有的重要方法如表 所示

表 TReport部件的方法

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

方法 功 能

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

Run 执行报表功能 输出报表

RunMacro 发送一个宏命令给Reportimith工具

Connect 预先连接报表文件和数据库 在输出报表时不需要登录到数据库

SetVariable 改变说明的报表变量

ReCalcReport 当报表变量改变以后 重新输出报表

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

还有一些其他的数据访问部件如TBatchMove部件 它主要用在两个数据库表之间移动或拷贝帆数据记录 具体的使用请参看本地SQL服务器的使用

应用举例 多个窗体显示同一个数据库表

在应用当中 我们常常需要以不同的视图显示同一个数据库表中的内容 例如要在两窗体中同时显示一个数据库表中一个记录的不同字段时 我们必须要想办法使两个窗体中的数据浏览部件同步地显示数据库表中的同一条记录的不同字段的值 要想做到以不同的视图显示同一个数据库表中的记录 下面两条规则是很重要的

● 多个TDataSource部件能够同时访问同一个数据集部件

● 在多个窗体中显示同一个表时 必须为每个窗体设置一个TDataSource部件 只须为其中的一个窗体设置一个TTable部件

例如 如果想在窗体Form 和Form 中同时显示一个数据库表的记录 最简单可行的办法是 为Form 和Form 各设置一个TDataSource部件叫DataSource DataSource 并在Form 中设置一个TTable部件Table 连接Form 中的Datasource 和Table 在程序运行过程中设置Form 中的DataSource 的DataSet属性为Form 中的Table 代码如下

Format DataSource Dataset := Form Table ;

这样 当Table 被打开时 两个窗体中便可以同步地显示数据库表中的同一条记录了

一个名叫OForms DPR的例子在C:\Delphi\DEMos\DB\TwoForms中(如果Delphi安装在其它的磁盘驱动器中 从相应的磁盘驱动器中可以找到该例子) 它演示了在两个窗体中显示同一个数据库表的记录 应用程序在第一个窗体中打开Contry DB表 并在窗体中显示Name Captial和Continent字段 在第二个窗体中显示Area和Population字段 在第一个窗体中有一个按钮用于打开第二个窗体 两个窗体中都有TDBNavigator部件 用于记录的导航

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25156

一 建立临时表 数据输入是开发数据库程序的必然环节 在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):TDataSet;var TempTable:TClientDataSet;begin TempTable:=nil; Result:=nil; if AFieldDefs<>nil then begin try TempTable:=TClientDataSet Create(Application); TempTable FieldDefs Assign(AFieldDefs); TempTable CreateDataSet; Result:=(TempTable as TDataSet); Except if TempTable<>nil then TempTable Free;

Result:=nil; raise;  end;end; end;

在程序中按如下方法使用 procedure TForm Button Click(Sender: TObject);var ADataSet:TDataSet;begin 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 Open; end;

ADataSet Free;end;

临时表创建完成

方法 使用简单 但由于利用查询控件 清空数据时需要查询服务器后台数据库 所以速度稍慢 而且不适用于临时表中各个字段由数个数据表的字段拼凑而成的情况 方法 适用范围广 速度快 但需要编写代码 (代码中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

在开发数据库软件的过程中 由于实际需求不断发生变化 数据库结构也将随之改变 这会给文档更新工作带来很大困难 如果能够用软件自动获得数据库的结构信息并生成报告文件 将减轻软件的文档工作量

TSession对象

为了管理应用程序与数据库系统的多重连接 Delphi提供了TSession对象 Delphi中的数据访问对象(Data Access Object)均包含Session属性 用来指向与之对应的TSession对象 如果应用程序需要同时建立对数据库系统(尤其是BDE数据库)的多个连接 就必须定义多个TSession对象 属于不同连接的数据访问对象的Session属性不能相同 否则将无法同时使用

在数据库应用程序运行时 Delphi会自动生成一个缺省TSession对象 名字为Session 数据访问对象在缺省情况下均与之相连

TSession对象除了自动管理数据库连接外 还能够取得数据库信息 下面就分别介绍这方面的函数

获取数据库别名信息

TSession对象在获取数据库别名方面有 个函数/过程

以下是引用片段 procedure TSession GetAliasNames(List: TStrings); procedure TSession GetAliasParams(const AliasName: string; List: TStrings); function TSession GetAliasDriverName(const AliasName: string): string;

GetAliasNames用来获得所有的BDE别名名称 结果保存在变量List中;GetAliasParams用来获得某个BDE别名的参数 结果保存在变量List中;GetAliasDriverName用来取得某个BDE别名使用的数据库驱动程序的名字

这 个函数不太复杂 就不多加介绍了 一般情况下 我们只需要使用GetAliasNames即可

获取数据表信息

在知道了数据库别名后 如何取出该别名对应数据库中包含的数据表呢可以使用TSession对象中的 GetTableNames过程 该过程描述如下

以下是引用片段 procedure TSession GetTableNames(const DatabaseName  Pattern: string;

各参数意义如下

DatabaseName 数据库别名;

Pattern 过滤器 用来过滤结果 可以使用通配符 比如 dbf t 等 如果为空字符串 则表示不需要过滤;

Extensions 为布尔量 表示是否显示数据表扩展名 该参数只对DBF和Paradox数据库有效;

SystemTables 为布尔量 表示是否显示系统数据表;

List 为返回结果 结果按字母顺序排序

lishixinzhi/Article/program/Delphi/201311/8542

以上就是关于Delphi数据库控件使用入门(一)全部的内容,包括:Delphi数据库控件使用入门(一)、DELPHI基础教程:数据访问部件的应用及编程(三)[4]、用Delphi开发数据库程序经验三则等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存