一 概述Delphi作为Windows下的一种快速开发工具 不仅能开发一般的Windows应用程序 而且还具有强大的数据库应用程序开发功能 Delphi本身提供了对BDE ODBC ADO和InterBase几种数据库驱动的支持 能够满足不同应用对数据库程序开发的需要 然而 在发布用Delphi开发的数据库程序时 除了要安装应用程序之外 还需要同时发布数据库驱动程序 这对于一些只涉及单个或多个简单表数据存储的单机应用程序来说 就显得有点头重脚轻的感觉了 况且 有些应用程序本身需要存储大量数据 但本身又要求结果短小精悍的话 用Delphi常规开发数据库的方法就不能满足需要了 那么 有没有办法解决上述矛盾 开发出能脱离庞大的数据库驱动程序的 瘦 数据库单机应用程序呢?Delphi 在Midas控件面板中提供了一个TClientDataSet控件 可以很好地解决这个问题 二 TClientDataSet使用要点TClientDataSet控件继承自TDataSet 其数据存储文件格式扩展名为 cds 是基于文件型数据存储和 *** 作的控件 该控件封装了对数据进行 *** 作处理的接口和功能 而本身并不依赖上述几种数据库驱动程序 基本上能满足单机 瘦 数据库应用程序的需要 .TClientDataSet的基本属性和方法介绍 ).FieldDefs: 字段定义列表属性开发者可通过单击属性编辑器中该属性编辑按钮 或在该控件上单击右键选择d出菜单中的 Fields Editor 菜单进行字段编辑 设置完此属性后 实际上就相当于定义了表的结构 如果想装入已有的数据表的结构和数据 可通过单击右键选择d出菜单中的 Assign Local Data 菜单 从d出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活) 使用注意 对于自定义的字段名表 该属性编辑完后 该控件仍然无法打开 必须右键单击该控件 选择d出菜单中的 Create DataSet 菜单 让该控件以上述编辑的字段列表为依据 创建数据集后 才能够被激活打开和使用 否则 会出现类似 ClientDataSet : Missing data provider or data packet 的错误(包括在运行期 运行期可调用该控件的CreateDataSet方法 从而动态定义字段和表) ).FileName属性说明 数据存储文件的名称 因该控件是基于文件型的数据 *** 作控件 因此 必须指定所 *** 作的数据文件名称(默认扩展名称 cds) 从而打开和激活该控件 进而进行数据编辑 例 利用此属性打开指定的 cds文件varPath: string;beginPath := ExtractFilePath(Application ExeName); //取得可执行文件路径CDataSet FileName := Path + test cds ;CDataSet Open;end; ).CreateDataSet方法说明 该方法以FieldDefs中的字段名表为结构建立数据集 常用来进行动态定义表 例 动态创建一具有姓名和年龄两个字段的数据集 //创建字段名表CDataSet FieldDefs Clear;with CDataSet FieldDefs AddFieldDef dobeginName := Name ;Size := ;DataType := ftString;end;with CDataSet FieldDefs AddFieldDef dobeginName := Age ;DataType := ftInteger;end;//动态创建数据集CDataSet CreateDataSet;//激活和打开该数据集CDataSet Open; ).Open方法说明 打开和激活数据集控件 从而进行数据编辑 a 如果指定了FileName属性 则直接用Open方法即可打开和激活该控件 见例 b 如果未指定FileName属性 可使用例 方法动态创建和打开数据集 进而 *** 作数据 ).LoadFromFile和SaveToFile说明 从文件中装入表结构和数据以及存储数据到文件 该方法类似于Word中的打开新文件和另存为的功能 例 :将数据集的数据存储到指定文件中CDataSet SaveToFile( c:\windows\desktop\test cds ); ) First(到首) Prior(向前) Next(向后) Last(到尾) Edit(编辑) CanCel(取消编辑) Post(保存) Insert(插入记录) Append(添加记录) Delete(删除) Refresh(数据刷新)等数据集常用方法说明 当指定了FileName属性时 其Post方法可将数据存入指定的文件中 类似其SaveToFile方法 如果未指定存储文件名 则Post方法只将数据存储在RAM中 其它方法 同一般数据集控件使用方法 略 ) Filter Filtered: 过滤筛选属性说明:用于筛选指定条件的记录 用法同一般数据集控件 略 例 在已经激活打开的数据集中筛选性别为男性的记录CDataSet Close;CDataSet Filter := 性别= + 男 + ;CDataSet Filtered := True;CDataSet Open; .使用TClientDataSet控件的应用程序发布的注意事项 如前所述 使用TClientDataSet控件的程序发布时不需要任何数据库驱动程序 大大节省了安装文件的大小 但是 在发布程序时别忘了将Windows系统目录下midas dll( KB)与应用程序一起发布(运行必须) 否则 程序仍然无法正常运行 三 结束语通过使用Delphi中TClientDataSet控件 既实现了应用程序可彻底脱离数据库驱动程序 也实现了常规数据集控件简单易用的特性 为编写 瘦 数据库应用程序提供了一种技术方法和手段 上述程序在Pwindows Delphi 下测试通过 lishixinzhi/Article/program/Delphi/201311/24702
从开发平台到服务器的向上适化
适化概述
所谓适化就是将桌面应用转化为Client/Server应用
适化是一个很复杂的主题 这里不详细讲述 本节将介绍适化Delphi 应用程序中最重要的方面
适化的主要方面有
● 将数据库从桌面平台到服务器的适化
● 将应用程序转化为Client/Server的适化
适化还需要实现从桌面环境到Client/Server环境的转化
桌面数据库和SQL服务器数据库在许多方面有不同之处 例如
● 桌面数据库用于同一时刻单用户的访问 而服务器用于多用户访问
● 桌面数据库是面向记录的 而服务器是面向集合的
● 桌面数据库将每个表存储在独立的文件中 而服务器将所有的表存储在数据库中Client/Server应用必须解决更新的问题 最复杂的是联接 网络和事务控制
适化数据库
适化数据库包含下列步骤
● 在桌面数据库结构的基础上 定义服务器上的元数据
● 将数据从桌面转化到服务器中
● 解决下列问题
● 数据类型差异
● 数据安全性和完整性
● 事务控制
● 数据访问权
● 数据合法性
● 锁定
Delphi提供了两种方法适化一个数据库
● 使用Database Desktop工具 选择菜单Tools/Utilities/Copy to命令将数据库表从桌面方式拷贝到SQL格式
● 建立应用TBatchMove部件的应用程序
这两种方法都可以将表结构和数据从桌面数据源转化到服务器上 依靠这些数据库 可能需要改变结果表 例如 可能想进行不同数据类型的映射
也可以将下列特征加入数据库
● 完整性约束
● 索引
● 检测约束
● 存储过程和触发器
● 其它服务器特征
如果用SQL脚本和服务器数据定义工具定义元数据会更有效 然后用前面介绍的两种方法转移数据 因为如果是手工定义数据库表 Database Desktop和TBatchMove 部件将只拷贝数据
适化应用程序
在理论上 设计用来访问局部数据的Delphi应用程序做很少的修改就可以访问远程服务器上的数据 如果在服务器上定义适合的数据源 你就能将应用程序指向访问它 这只需简单地改变应用程序中TTable或TQuery部件的DatabaseName属性
实际上 在访问局部和过程数据源之间有许多重要的不同之处 Client/Server应用程序必须解决大量的在桌面应用中所没有的问题
任何Delphi应用程序都能用TTable或TQuery部件访问数据 桌面应用程序通常都是使用TTable部件 当适化到SQL服务器上时 用TQuery会更有效 如果应用程序要检索大量记录 则TQuery部件要略胜一筹
如果应用程序使用统计或数学函数 那么在服务器上通过存储过程执行这些函数会更有效 因为存储过程执行更快 使用存储过程还可以减少网络负载 特别是大量行数据的函数
例如 计算大量记录的标准差
● 如果该函数在客户端执行 所有的值从服务器上检索出来并送到客户端 导致网络拥塞
● 如果该函数在服务器端执行 则应用程序只需要服务器上的答案
Delphi客户/服务器应用实例分析
本节中采用的实例是Delphi 数据库的例子CSDEMO CSDEMO是Delphi客户/服务器编程的示例程序 它采用的数据库服务器是Local InterBase Server
CSDEMO较好地示范了BDE环境的配置 InterBASE Server高级功能应用 SQL服务器联接 触发器应用 存储过程编程和事务控制技术等 具有较高的参考价值 本节讲述下列内容
● 数据库环境介绍
● TDatabase的应用
● 不同数据库表的切换
● 触发器编程
● 存储过程编程
● 事务控制应用
数据库环境介绍
本例中采用的数据库服务器是Local InterBase Server Local InterBase是InterBase Server的单用户版 位 兼容ANSI SQL Local InterBase支持客户/服务器应用在单机上的开发和测试 并且可以很容易地适化到InterBase Server上 因此 开发客户/服务器应用采用Local InterBase作为原型开发环境是很方便的
IBLOCAL的BDE参数
本例中的SQL数据库是IBLOCAL 它是由BDE配置工具(BDECFG EXE)设置参数值 它的各项参数值列于下表
表 IBLOCAL的各项参数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
参 数 名 参 数 值
────────────────────────────────────
TYPE INTRBASE
PATH
SERVER NAME C:\INTRBASE\EXAMPLES\EMPLOYEE GDB
USER NAME SYSDBA
OPEN MODE READ/WRITE
SCHEMA CACHE SIZE
LANGDRIVER
SQLQRYMODE
SQLPASSTHRU MODE SHARED AUTOMIT
SCHEMA CHCHE TIME
MAX ROWS
BATCH COUNT
ENABLE SCHEMA CACHE FALSE
SCHEMA CACHE DIR
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
数据库结构介绍
IBLOCAL数据库的结构都是由InterBase服务器工具交互式SQL工具(ISQL)定义的
用ISQL定义数据库 首先要用Create Database命令建立数据库 建立的新数据库一般是以GDB为扩展名 建立好后 就可以用SQL语言定义数据库表 例如建立EMPLOYEE表的SQL语句如下
定义域名数据类型
CREATE DOMAIN FIRSTNAME AS VARCHAR( )
CREATE DOMAIN LASTNAME AS VARCHAR( )
CREATE DOMAIN COUNTRYNAME AS VARCHAR( )
CREATE DOMAIN EMPNO AS SMALLINT;
CREATE DOMAIN DEPTNO AS CHAR( )
CHECK (VALUE = OR (VALUE > AND VALUE <= ) OR VALUE IS NULL)
CREATE DOMAIN JOBCODE AS VARCHAR( )
CHECK (VALUE > )
CREATE DOMAIN JOBGRADE AS SMALLINT
CHECK (VALUE BEEEN AND )
CREATE DOMAIN SALARY AS NUMERIC( )
DEFAULT
CHECK (VALUE > )
建立EMPLOYEE表
lishixinzhi/Article/program/Delphi/201311/25125
参考使用MysqlDac控件,有破解版下载。就想用ado连接sqlserver一样,不需建立数据源之类的。
Connection: TmySQLDatabase; //连接
Connection := TmySQLDatabaseCreate(nil);
ConnectionDatabaseName := DBName;
ConnectionHost := DBAdrr;
ConnectionUserName := UserName;
ConnectionUserPassword := PassWord;
ConnectionLoginPrompt := False;
if ConnectionConnected = True then
ConnectionConnected := False;
try
ConnectionOpen;
except
Result := False;
SetISConnected(False);
fLogIniWriteString(DateTimeToStr(Now),'CONDATABASEERR','FALSE');
Exit;
end;
pQuery := TmySQLQueryCreate(nil);
pQueryDatabase := fServerDBConnection;
pQuerySQLText :=
pQueryOpen;
while not pQueryEof do
begin
pQueryFieldByName
。。。。。。。
Delphi作为一种目前十分流行的数据库开发语言 在数据库开发领域有着十分重要的地位 它不仅提供了可视化的开发环境 使得开发变得相对容易 而且还是一种面向对象的语言 使得程序员能够充分利用面向对象编程的种种优势——如封装 继承等等 从而大大减轻了开发的难度和工作量 下面 我们就谈一谈利用面向对象的特性来开发数据库控件的方法
Delphi本身提供了一些数据库控件 如DBGrid Table等 它们给开发带来了很多方便 下面我们来以一个能够显示数据表中的所有字段的控件为例来说明如何用Delphi来进行控件的编程
首先要为控件选择一个合适的父类 Windows的一个好处就在于它将许多 *** 作标准化了 通过这些标准的 *** 作 使得学习和使用都有章可循 用户就很容 易融会贯通地掌握整个系统 在Delphi中提供了许多控件 这些控件生成的应用程序足以满足Windows编程的要求 而一些新的控件也可以在此基础上 产生 它一方面继承了一部分控件标准的 *** 作 另一方面也在程序中加入一些代码来实现特定的功能 这样用户使用起来不会觉得突兀 也简化了程序的开发 根据 我们的目标可以看出 利用 下拉框 控件作为新控件的父类比较合适 因为它提供了下拉框中的所有标准 *** 作 这就可以大大减少我们的编程量 然后就是为 特定的功能编写代码 我们应该想到 如果一个下拉框能够显示一个数据库中的所有字段 那么它一定有一个属性能够与数据库相连 我们将这个属性定名为 DataSource 并将这一属性添加到控件中 添加的方法是 首先在Private段中加入如下代码
FDataLink:TFieldDataLink; function GetDataSource:TDataSource; Procedure SetDataSource( Value:TDataSource);其中TfieldDataLink是一个十分重要的类 我们之所以能够很容易地进行数据库控件的开发全是拜它之赐 它有一些十分有用的属性 如 DataSource 利用这个属性 我们就能很容易地指定新控件的DataSource属性
第三步就是为控件的功能编写代码 可以想到 如果我们想要在拉下下拉框时显示数据库中的所有字段 就要在它的DropDown事件中加入代码来将所有 的字段加入到下拉框的下拉区域中 这应该分两步走 第一就是要取得指定数据库的所有字段 第二就是将这些字段以字符串的格式加入到下拉框中(而拉下时显示 所有字段的功能则由下拉框控件自己完成) 在取得数据库的字段时 用到了我们上面提到的TfieldDataLink类 下面的代码就可以获得指定数据库 的字段数目
j:= ; j:=FDataLink DataSource DataSet FieldCount ;//取得数据库中的所有字段的名字 I:= ;
然后再用下面的代码将这些字段的名字加入到下拉框的items属性中 值得注意的是在每次拉下这个下拉框时都要将items属性清空 否则这个下拉框将每次都会因加入重复的内容而变得越来越长 并且一次选择可以选定许多项 使得控件看起来有点怪
items Clear ; //清空items属性
repeat //循环 *** 作将字段加入下拉框中
items Add (FDataLink DataSet Fields[I] FieldName ); //将字段名加入到下拉框中
I:=I+ ;
until I>j- ; //直到所有的字段加入完为止
第四步 就是将以上代码加入到Delphi的控件编辑窗口中去 点击Delphi的 Component/New Component 菜单 系统出现一个对话框 将对话框如图 所示填写
填写完毕点击 OK 按钮 就可以创建一个文件 将上面提供的代码加入到文件的适当位置 就可以完成这个控件的编写 图 是带有这个控件的程序的例子
可以想见 这个控件有着十分广泛的功能 例如 我们能够利用它设置指定字段的值来运行查询 也可以返回数据库中指定字段的数据类型 长度等信息 给我们的编程提供了极大的方便
但是也应该看到 这个控件也有一些缺点 那就是它只能显示字段的名称 一般的数据库中字段的名称都是英文的 这给中文版的应用软件带来不便 下面我们 就用FdataLink的另一个属性来显示中文化的字段 这个属性就是DisplayName 它所指定的是数据库字段的显示名称 而这个名称我们可以在 设计时将其汉化 这样在应用程序中显示出来的就是有意义的中文了
lishixinzhi/Article/program/Delphi/201311/8535
可以开发,不过,你需要共享数据库
路径
,另外,还要自己处理数据并发与锁定,所以,不建议你用paradox,建议你用interbase
或sql
server
,delphi的ado+
sql
server
非常好用!
interbase,目前的XE版破解经常失效。。
内建的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
以上就是关于Delphi开发单机瘦数据库程序要点全部的内容,包括:Delphi开发单机瘦数据库程序要点、DELPHI基础教程:Delphi客户服务器应用开发(四)[1]、delphi中连接mysql数据库,数据源要怎么建等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)