三层中的数据更新问题,重大疑问,相信你们也遇到过! (30分)

  • 主题发起人 liujunzhang
  • 开始时间
L

liujunzhang

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
在应用程序带参数的前提下,
如:Select Id,name From Good Where Id=:ID
在客户我是这样传输参数的:
ClientDataset1.FetchParams;
ClientDataset1.Params.ParamByName('ID').Value:='123';
Clientdataset1.Close;
Clientdataset1.Open;
但是在客户端的Dbgrid中能显示出相关的数据,但是我改了数据之后,却不能用
ClientDataset1.ApplyUpdate(0),来更新数据,为何?
 
先去掉参数,试一下能不能更新数据Select Id,name From Good
 
procedure TDMBase.CDSReconcileError(DataSet: TClientDataSet;
E: EReconcileError;
UpdateKind: TUpdateKind;
var Action: TReconcileAction);
begin

showMessage(E.message);
Action := raCancel;
end;

看看它报什么错误,然后再讨论。
 
跟踪一下程序,在ApplyUpdates之前,看看ClientDataSet的Delta有没有值,另外就是楼上
朋友说的办法了
 
1。去掉参数能更新数据
2。我跟踪了,在beforeApplyUpdate 和afterapplyupdate事件中
我都加了 showmessage('sdf')之类的东西,它们也都显示了,
但是,结果还是没有。奇怪?
 
按wumeng的方法试试看有什么错误
 
这种错误,有很多情况,你选把错误信息帖出来,然后再讨论吧
 
在ClientDataset1的OnReconcileError事件里加入
showmessage(E.message)看一看,老兄
 
to_liujunzhang,:以前有一个网友曾经提个类似的问题。是因为DELPHI内部的差。当您改掉
数据后。DELPHI把它当作一个空值。所以您保存不起的原因。您可以重取一次数据再保存试
一下。
 
试过了以上的方法,NO,还有其它吗?
 
我总感觉在
ClientDataset1.Params.ParamByName('ID').Value:='123';这个赋值语句后来应该有一条
关于ClientDataset1.Params的执行的语句,你自己找找试试吧
 
>>试过了以上的方法,NO,还有其它吗?
你是说DELPHI没有报任何错误吗???
 
你是不是开了两个题目呀?!我在另一个题目中回答了,并我也测试成功了。
 
我也觉得很奇层,不知是否还有其它方法代替。
 
注意:
在参数更新过程中,我另用了一个表,即多表关联,不知道有没有影吶。
如 select A.*,B,Name From Goods A,mode B where A.ModeNo=B.ModeNo and A.Id=:ID
以上是应用程序处的SQL语句,
不知各位有何高见?
 
如果不是ADO接口,这样不能更新,只有用ADO数据接口才行。
 
To liujunzhang
你查一下我的已答问题吧,这样类似的问题我答过多次了。关键在APP SERVER的
TBaseProvider.UpdateMode,如果TDataSetProvider.ResolveToDataSet:=TRUE的话。
TDataSetProvider.ResolveToDataSet:=FALSE,你就要自己控制更新。
 
To WuMeng:
能发一个现在例子给我吗?成的话,我把分给你,OK?
EMAIL:renshi@china.com.cn
 
我现在还没有现成的例子。你查一下我的回答和提问,应该能解决问题的。
 
不知道楼上几位是不是看50分太少,回答问题的时候有没有帮别人做个示例测试测试,尽说些文不对题的东西!
我做了个例子来测试,发现用DataRequst来更新数据或用参数方式来更新数据也好,COM+服务器都会创建一个实例
来服务客户端的请求(因为是无状态的COM+),所以问题的根本原因出在服务器的数据集状态不正常(没有请求的客户
端对应),在测试中发现参数方式下更新数据时服务器数据集的参数的值总是设计时指定的值(一般是NULL),所以数据
更新时无法找到对应的记录导致更新失败。
  要解决问题的关键在于如何使服务器的数据集控件的参数值与客户端当前请求更新数据的ClientDataSet的参数值
对应,我的想法时,在ClientDataSet.BeforApplyUpdates事件中,通过OwnerData将当前的参数值传给服务器就可以了!
以前方法已通过本人测试,可行。不知还有哪位能否提出更好的办法?
 
顶部