三层次重大问题:适用ClientDataSet插入一条记录后无法显示,需关闭程序再打开才有用?(200分)

  • 主题发起人 主题发起人 tomol
  • 开始时间 开始时间
T

tomol

Unregistered / Unconfirmed
GUEST, unregistred user!
三层次重大问题:适用ClientDataSet插入一条记录后无法显示,需关闭程序再打开才有用?
具体如下。
有两个表TMaster, TDetail
已按照正确(李维书中所讲)的方法建立应用程序服务器和客户端
客户端有主细表关系:
ClientDataSetMaster, ClientDataSetDetail(在应用程序服务器上
已建立正常的主细档关系)
还有一个ClientDataSet2取得细档表中的所有数据(select * from TDetail)
现在我使用ClientDataSet2向TDetail表中插入一条新记录,并ApplyUpdate(0),
但在ClientDataSetDetail中却怎么也看不到,于是
我用ClientDataSetMaster.ApplyUpdate(0)不行;
我用ClientDataSetMaster.close;
ClientDataSetMaster.open;不行
我用socketConnection1.connected := false;
socketConnection1.connected := true;也不行
我实在是没办法了,望各位前辈救救小弟吧,多谢!!!!!!!!!!!!!!!
 
ClientDataSetMaster.Excute;
tableName.Refresh;

understand
 
应该只更新了本地的信息,还没传到服务器上。
 
to haloon:
什么是:tableName.Refresh;????
在哪里写这些语句???
 
to 雪上霜:
数据库中已经添加了,但主细档结构的数据集没有取出来;
不过我们发现了一个方法:
同时使用下列语句:
socketConnection1.connected := false;
socketConnection1.connected := true;
ClientDataSetMaster.close;
ClientDataSetMaster.open;
就可以看到了,但这样作似乎不太好吧
 
是不是服务器端的Table的requestlive属性没设?
 
to ranking:
我用的是ADODataSet
 
同时使用下列语句:
ClientDataSetMaster.close;
ClientDataSetMaster.open;
就可以看到了,这样作肯定可以更新数据库的数据,
一定是你在显示数据集数据时先固定死了
这不先关闭一下再打开就没问题了
 
to 攸游:
仅仅同时使用下列语句:
ClientDataSetMaster.close;
ClientDataSetMaster.open;还不行,
必须要同时使用下列语句:
socketConnection1.connected := false;
socketConnection1.connected := true;
ClientDataSetMaster.close;
ClientDataSetMaster.open;
才可以,你可以试一下

有没有更好的方法??
 
您的中间层的TBaseProvider.UpdateMode:=upWhereKeyOnly;手工设置ADODataSet的
TField.ProviderFlags,保证你表中的关键字在这个属性中有[pfInUpdate,pfInWhere,
pfInKey],主要是有pfInKey。
TDataSetProvider.ResolveToDataSet:=TRUE
用主表的ClientDataSetMaster.ApplyUpdate(0)。这样就可以了。
 
ClientDataSet.ApplyUpdates(0);
ClientDataSet.MergeChangeLog;
 
ClientDataSet.ApplyUpdates(0);就行了,它会自己调用这句的,ClientDataSet.MergeChangeLog;
这也就是李维说的ClientDataSet的聪明之处 :)
 
这样不好。
var
DataSet:TClientDataSet;
begin
DataSet:=nil;Result:=False;
try//try...finally...statement
Screen.Cursor:=crHourGlass;
DataSet:=TClientDataset.Create(Application);
DataSet.RemoteServer:=frmMainWindow.SocketConnection1;
DataSet.ProviderName:='dsQueryCommon';
DataSet.CommandText:=ClientDataSet.CommandText;
try//try...except...statement
DataSet.Active:=True;
DataSet.Data:=ClientDataSet.Data;
if DataSet.ApplyUpdates(0)=0 then
begin
SaveSuccess;Result:=True;
DataSet.MergeChangeLog;
ClientDataSet.MergeChangeLog;
ClientDataSet.Refresh;
end
else begin
DataSet.CancelUpdates;
SaveFail;
end;
except//try...except...statement
end;//try...except...statement
finally//try...finally...statement
if DataSet<>nil then DataSet.Destroy;
Screen.Cursor:=crDefault;
end;//try...finally...statement
这样每个模块的ClientDataSet就不需要DataSetProvider。
打开数据也可以类似做。
 
>>这样每个模块的ClientDataSet就不需要DataSetProvider。

程序中要用什么元件,完全是程序员的个人爱好,只要你能实现想要实现的功能,怎么作
都可以。你说是吧? :)
 
如果我沒有理解錯的誥應是ClientDataSet2新增一筆記錄,在clientdateset1中要立即看到
可在clientdateset2用完applyupdates(0)後在clientdateset1中用refresh更新一下就可
以看到了.不是嗎?
 
我发现ClientDataSet.ApplyUpdates(0)是有点怪,有时能更新成功,有时又不能。/
我在客户端修了数据,然后applyupdates(0),服务器数据根本不动。不知什么原因。
还有就是用Navigate中点那个refresh 时会报错。
 
我也有過這類問題,當時我發現是數據庫問題,我重建了數據庫就可以了,
我想是不是數據庫壞掉了,是否有人也有同感.
 
提问者怎么不说话了,我们的方法您试了吗?
 
后退
顶部