- 浏览: 2068836 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
转自:http://hi.baidu.com/0xcea4/blog/item/b01c4bdb1576f1d1b7fd48c5.html
Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法.
首先,在中间层添加一个方法,就叫ApplyUpdates吧.方法定义如下:
function ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;
参数UpdateTable是指要更新的表名,Delta是指传过来的TClientDataSet的Delta属性,如果更新错误err返回错误的内容.下面实现这个方法,首先在DataModule上放一个Query,Query连上Connection,然后再放一个TDataSetProvider连Query.代码如下:
function TRoDm.ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;
const sql='select * from %s where 1<>1';
var sqlstr:string;
ErrCount:Integer;
begin
Result:=False;
sqlstr:=Format(sql,[UpdateTable]);
try
Conn.BeginTrans;
Query.Close;
Query.sql.text:=sqlstr;
Query.open;
Provider.ApplyUpdates(Delta,-1,ErrCount);
Result:=ErrCount=0;
if Result then
Conn.CommitTrans
else Conn.RollbackTrans;
except
on E:Exception do
begin
Conn.RollbackTrans;
err:=E.Message;
end;
end;
end;
到此,通用的更新方法已经完成了.不过客户端的ClientDataSet还不能查询显示数据,因此,还要写一个查询方法:
function QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;
参数sqlstr就是要持行的查询语句,Data返回查询结果,错误时err返回错误消息
QuerySQL实现代码如下:
function TRoDm.QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;
begin
Result:=False;
try
Query.close;
Query.sql.text:=sqlstr;
Query.sql.Open;
Data:=Provider.Data;
Result:=True;
Except
on E:Exception do
err:=E.Message;
end;
end;
到这里,中间层的代码已经完了,客户端的调用就简单了.比如客户端有个数据模块DM,上面放一个DcomConnection或者SocketConnection,名叫Conn.例如,我们现在要做一个商品管理的功能,在窗体上放一个TClientDataSet叫Cds,放DataSource,DBGrid等,设置好相应的属性.然后在窗体创建(Create事件)时查询回所有数据,代码如下:
const sql='select * from xxxx';
var Data:Variant;
err:String;
begin
if Dm.Conn.AppServer.QuerySQL(sql,Data,err) then
Cds.Data:=Data
else MessageBox(self.handle,pchar('查询数据出错:'+err),'错误',MB_OK+MB_ICONERROR);
end;
然后还有"添加","修改","删除"按扭,代码都和我们平时操作一样,比如"添加"按扭的代码:
cds.append;
cds.fieldbyname('xxx').asinteger:=xxx;
//....
cds.post;
修改,删除也这样写.不过现在还有个小问题是,这个表的主键的生成问题,这里我们不能用自增主键,要自己自己生成主键,这样你还得在中间层写一个中间层生成主键的方法,在"增加"按扭时生调用生成主键,然后再上面的操作.这里不再多说.
增删改完后,这时的数据还在客户端的内存里,想保存到远程的中间层服务器就要用到我们刚才的方法了,下面就是"保存"按扭下的代码:
var err:string;
begin
if cds.ChangeCount=0 then exit;//数据没改变就不用提交了
if Dm.Conn.AppServer.ApplyUpdates('xxx',cds.Delta,err) then//xxx就是表名了
begin
MessageBox(self.handle,'保存成功!','提示',MB_OK+MB_ICONINFORMATION);
cds.MergeChangeLog;//合并所有改变的数据
end else MessageBox(self.handle,pchar('保存出错:'+err),'错误',MB_OK+MB_ICONERROR);
end;
到此,这篇文章也讲完了.用这个方法,那些单表的基础数据更新还可以写成一个祖先类,只要加一个取得更新表名的虚方法,比如:function TableName:string;virtual;然后其后代只要override这个方法,返回各自的表名,其他的一句代码都不用写.
发表评论
-
form打开时的关闭代码
2011-10-25 20:29 1591摘自:http://topic.csdn.n ... -
TUpdateSQL更新问题 提示Update Failed
2011-08-29 20:26 1247摘自:http://topic.csdn.net/u/200 ... -
图解如何用Eurekalog跟踪程序错误
2011-08-12 07:28 949图解如何用Eurekalog跟踪程序错误 摘自:h ... -
VirtualBox 复制VDI 并能创建新的虚拟机
2011-07-21 11:14 2751摘自:http://www.nonabyte.net/how- ... -
截获所有异常 不报错
2011-07-12 16:52 1246摘自:http://media.ccidnet.c ... -
delphi exe程序以及DLL程序如何在模块内部获得各自的路径
2011-07-11 16:38 1312delphi Exe程序以及DLL程序如何在模块内部获得各自的 ... -
Delphi文本文件读写
2011-07-11 14:55 1267Delphi文本文件读写 (2008-10-31 1 ... -
Delphi自定义的消息的使用
2011-05-31 14:12 2323阅:已验证,可通过; 摘自:http://blog.1 ... -
怎么查看OutputDebugString输出的信息?debugview
2011-05-25 16:02 3841网上很多说用debugview查看,我自己写了一个程序,里面用 ... -
Delphi里查看该变量的内存值
2011-05-25 13:32 1137Delphi里查看该变量的内存值:Run==>Evalu ... -
注册表操作 写入autorun启动项,键值为本程序的全路径
2011-05-20 15:40 1834procedure TForm4.Button2Click ... -
报说包frx7和frxdb7都包含了某个单元的错误
2011-05-11 09:59 10411. 问题描述:在安装FastReport3的时候,安装到- ... -
Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
2011-05-03 14:34 1472摘自:http://blog.csdn.net/g ... -
WM_USER的说明 用户消息ID
2011-04-28 10:46 1696WM_USER 摘自:http://baike.bai ... -
ToolButton不能改变大小
2011-04-28 10:38 3470问题描述:ToolButton不能改变大小? 问 ... -
Delphi里TOOLBAR 上的button的caption为什么显示不出来啊
2011-04-20 17:55 1780Delphi里TOOLBAR 上的button的caption ... -
delphi指针简单入门
2011-04-11 21:42 1164摘自:http://topic.csdn.net/t/2003 ... -
Delphi中paramstr的用法 应用程序间传递数据
2011-04-01 14:33 2116Delphi中paramstr的用法 应用程序间传递数据 ... -
Delphi中的THashedStringList对象 --大数据量时
2011-04-01 13:54 5165Delphi中的THashedStringLi ... -
inherited Create(AOwner); 和直接写inherited有区别吗
2011-03-26 15:44 1328摘自:http://zhidao.baidu.com/que ...
相关推荐
### Delphi三层开发小技巧-单表更新 #### 背景与意义 在软件开发过程中,特别是数据库相关的应用程序开发中,数据的一致性、安全性和效率是非常重要的考量因素。Delphi作为一种流行的开发工具,提供了丰富的功能来...
Delphi,作为一款强大的RAD(快速应用开发)工具,是实现这种三层架构的理想选择。本主题将深入探讨在Delphi中进行三层多层数据库开发的技术要点。 首先,让我们关注MIDAS(Microsoft Internet Data Sessions),这...
客户程序必须提供获取数据的机制,在Delphi 4中,TClientDataSet有三种途径获取数据:从文件中存取数据、从本地的另一个数据集中获取数据、通过IProvider接口从远程数据库服务器获取数据。 在浏览和编辑数据时,...
7. **调试与测试**:Delphi XE7提供了一个强大的集成开发环境(IDE),允许开发者在运行时对DataSnap服务器进行调试和测试,以确保其正确运行。 8. **跨平台支持**:由于Delphi XE7的FireMonkey框架,DataSnap创建...
总结起来,这个项目是一个用Delphi xe10.1编写的程序,主要功能是处理CDS和TFDMemTable的数据变更,并将其转化为SQL语句以更新数据库。代码中可能包含了一些特定的数据类型处理逻辑,以及一个主窗体和几个关键的源...
5. **Delphi的数据库组件**:Delphi提供了丰富的数据库组件,如TClientDataSet、TDatasource、TADOConnection等,它们简化了数据库操作。例如,TClientDataSet可以在本地存储数据,提供离线功能;TDatasource作为...
在开发B/S系统时,通常会使用如TDBGrid、TDataSource、TClientDataSet等组件来处理数据库操作。TDBGrid用于显示数据,TDataSource作为数据源管理,TClientDataSet则在客户端缓存数据并提供离线操作功能。 五、Web...
#### 三、TClientDataSet 的数据获取方式 TClientDataSet支持多种数据获取方式,具体包括: 1. **从文件中读取数据**:这种方式适用于将数据保存在文件中,然后在客户端加载使用。 2. **从本地另一个数据集中获取...
本文档主要介绍了使用Delphi7结合Microsoft SQL Server 2000(简称MSSQL2K)进行三层架构开发的方法,特别关注了服务端与客户端的数据模块(Data Module)设置实例。三层架构指的是将应用程序分为表示层、业务逻辑层...
在IT行业中,多层开发是一种常见的架构设计方法,它将应用程序分为不同的逻辑层,每层专注于特定的功能,以此实现更好的可维护性、扩展性和复用性。Delphi,作为一个强大的面向对象的编程环境,提供了多种多层开发...
在Delphi这个强大的RAD(快速应用程序开发)环境中,构建三层架构的数据库应用是一种常见的方法,它能够有效地分离业务逻辑、数据访问和用户界面,提高代码的可维护性和复用性。本教程将深入探讨Delphi三层数据库...
- **Delphi客户端**:Delphi客户端通过TClientDataSet组件与服务器端进行数据交互。为了确保与原有开发流程的兼容性,TClientDataSet的封装保持了原有的风格。同时,客户端采用了基于阻塞模式的Indy通信组件进行网络...
cds-memleak 完成该项目的目的是揭示Delphi中一个广泛使用的名为TClientDataset的组件中的内存泄漏。动机我工作的公司到处都使用TClientDatasets。 我们已经编写了许多后端工具来支持我们的数据传递系统。 一种这样...
1. **三层架构**:三层架构是一种软件设计模式,将应用分为表现层(用户界面)、业务逻辑层(处理业务规则)和数据访问层(与数据库交互)。这种分离有助于提高代码的可维护性和可重用性。 2. **Delphi XE7**:这是...
2. **VCL框架**:Delphi 7基于Visual Component Library (VCL)框架,书中会详细介绍VCL组件的使用,包括TForm、TButton、TMemo等基本控件以及数据绑定的组件如TDBGrid、TDataSource等。 3. **数据库接口**:Delphi ...
1. **数据库组件**:Delphi提供了多种数据库组件,如TDataSource、TClientDataSet、TDataset、TDBGrid等,这些组件构成了数据库应用程序的基础。TDataSource负责连接数据,TClientDataSet则作为内存中的数据集,可以...
10. **多层架构开发**: Delphi 5允许开发者构建客户端-服务器(C/S)或三层(N-Tier)架构的应用,其中数据库逻辑和数据访问层可以独立于用户界面部署,提高了系统的可维护性和扩展性。 综上所述,Delphi 5数据库...
在Delphi编程环境中,开发自定义Grid控件是一项常见的任务,尤其对于那些希望对界面有更高定制需求的开发者来说。Grid控件是用于显示二维数据的常见组件,它提供了直观的方式来展示表格形式的信息。在本篇文章中,...
Delphi XE技术:Datasnap三层 Server端: windows 8操作系统下win 32应用程序; TServerMethods1中,定义了过程(参数strSQL为SQL语句):function MyGetData(const strSQL: string): OleVariant;过程中,使用了...