ClientDataSet问题
程序为两层结构,控件关系如下:
DBGrid1--DataSource1--ClientDataSet1--DataSetProvider1--ADOQuery
如上,ClientDataSet1 post后,如何获取ClientDataSet1新增/修改/删除的记录?
注意:ClientDataSet1并不需ApplyUpdates到数据库.
问题点数:200、回复次数:16Top
1 楼zsjzwj(北极熊)回复于 2006-03-17 09:03:03 得分 0
用ClientDataSet2再取数进行比较Top
2 楼xiaocuo_zrf(小错——淫雄所贱略同)回复于 2006-03-17 09:08:11 得分 20
笨办法:
多置一个标记字段到ClientDataSet
新增的设置为 0 修改的设置为1,删除为假删除,设置为2
然后filter掉。
反正不用提交到数据库哦Top
3 楼wdsimon(我是谁?)回复于 2006-03-17 09:08:35 得分 0
ClientDataSet1内将会有好几千条记录,效率是否比较低呢?Top
4 楼wdsimon(我是谁?)回复于 2006-03-17 09:12:47 得分 0
to 小错:
那如何知道记录被修改(可修改字段有5个,如修改主键需记录修改前主键)呢,代码写在哪里?Top
5 楼xiaocuo_zrf(小错——淫雄所贱略同)回复于 2006-03-17 09:16:10 得分 0
修改主键需记录修改前主键
---
Field不是有 OldValue ,NewValue么Top
6 楼wdsimon(我是谁?)回复于 2006-03-17 09:21:22 得分 0
老王(闭关中)(182274401) 09:14:46
写在onChange里?
小错(37388732) 09:10:19
OnChange应该不行的。
小错(37388732) 09:10:51
不知道SetText行不行。或者 AfterPost
Top
7 楼xiaocuo_zrf(小错——淫雄所贱略同)回复于 2006-03-17 09:45:52 得分 0
刚刚试了几个办法,都没有能实现 :-(Top
8 楼hu1313(crazyguy)回复于 2006-03-17 09:49:12 得分 0
用ClientDataSet1.Delta来得到ClientDataSet1变动过的记录Top
9 楼xiaocuo_zrf(小错——淫雄所贱略同)回复于 2006-03-17 09:58:29 得分 0
嗯。可以考虑在
procedure TForm3.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
begin
end;
这个事件下面实现....
应该是可以的
Top
10 楼xiaocuo_zrf(小错——淫雄所贱略同)回复于 2006-03-17 09:59:56 得分 0
不过你要先调用 ApplyUpdates。
然后再Applied 控制不提交。Top
11 楼wdsimon(我是谁?)回复于 2006-03-17 10:25:21 得分 0
to:月亮,哈欠,hu1313(crazyguy
用ClientDataSet1.Delta来得到ClientDataSet1变动过的记录是可以,但如何知道这些记录那些是修改前的,那些是修改后的,那些是新增/删除的呢?delta没有标记?
to:小错
BeforeUpdateRecord当中可以获知字段的状态,可以知道记录状态吗?Top
12 楼hu1313(crazyguy)回复于 2006-03-17 10:31:23 得分 60
cdsDefTemp.Data:=cdsSensorDefine.Delta;
cdsDefTemp.First;
with cdsDefTemp do
while not EOF do
begin
if UpdateStatus = usDeleted then
Status:='usDeleted';
if UpdateStatus = usInserted then
Status:='usInserted';
if UpdateStatus = usModified then
Status:='usModified';
if UpdateStatus = usUnmodified then
Status:='usUnmodified';
Top
13 楼hongqi162(失踪的月亮)回复于 2006-03-17 10:38:42 得分 60
with self.ClientDataSet1 do
begin
append;
fieldByName('cid').AsInteger:=12;
fieldByName('cName').AsString:='12';
post;
end;
self.ClientDataSet2.Data:=self.ClientDataSet1.Delta;
with self.ClientDataSet2 do
begin
while not eof do
begin
if UpdateStatus = usDeleted then
showmessage('Deleted ');
if UpdateStatus = usInserted then
showmessage('Inserted');
if UpdateStatus = usModified then
showmessage('Modified');
next;
end;
end;Top
14 楼hongqi162(失踪的月亮)回复于 2006-03-17 10:41:13 得分 0
呵呵,没有刷新帖子 和楼上的方法一样Top
15 楼halfdream(哈欠)回复于 2006-03-17 10:53:41 得分 60
蹭分蹭分中.....
参考provider.pas
function TUpdateTree.DoUpdates: Boolean;Top
16 楼wdsimon(我是谁?)回复于 2006-03-17 10:54:37 得分 0
好结贴Top




