多层数据库开发中的问题

yejun52 2004-09-14 09:32:41
1。TClientDataSet组件中的OnReconcileError事件用于处理提交不成功的记录。TReconcileAction { raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh };可在此事件中通过Action引用参数赋值回传后,TClientDataSet中的相应记录记录内容并未有任何变化。这是什么原因?
2。当某个客户端TClientDataSet中的未决记录提交成功后,该怎样通知其他客户端?目前采用的方法是,应用服务端接受一次客户端更新就给所有连接客户端发送更新通知消息。问题是,如果其他客户端收到更新消息时,数据库服务器中对应记录内容尚未得到更新(应用服务端提交记录到数据库服务器有延时),这样导致其他客户端读取的记录依旧是old.
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CB1013 2004-09-17
  • 打赏
  • 举报
回复
1.
void __fastcall TForm1::ClientDataSetReconcileError(TClientDataSet *DataSet, EReconcileError *E, Db::TUpdateKind UpdateKind, TReconcileAction &Action)
{
Action = HandleReconcileError(Owner, DataSet, UpdateKind, E);
}
2.
try
{
ClientDataSet1->ApplyUpdates(-1);
ShowMessage("已正确写入数据库!!");

{
catch(Exception &exception)
{
Application->ShowException(&exception);
}
yejun52 2004-09-16
  • 打赏
  • 举报
回复
还有可以帮忙的人吗
lidawen 2004-09-15
  • 打赏
  • 举报
回复
up
yejun52 2004-09-15
  • 打赏
  • 举报
回复
没人知道吗?help
sunliwen780502 2004-09-15
  • 打赏
  • 举报
回复
1.
void __fastcall TForm1::ClientDataSetReconcileError(TClientDataSet *DataSet, EReconcileError *E, Db::TUpdateKind UpdateKind, TReconcileAction &Action)
{
Action = HandleReconcileError(this, DataSet, UpdateKind, E);
}

客户程序在内存中为数据建立了一个数据的副本,并利用这个副本来进行工作.而其他的拥护有可能已经修改了数据,即内存中的数据已经不是数据库中的实际的数据了.当然了,为了使内存中的数据是最新的数据,我们可以调用TClientDataSet控件的Refresh函数来刷新数据.但是在调用Refresh函数前要保证Client端每用未决定的修改.也就是说Client端的日志中没有记载任何的修改信息,否则他会触发异常.也可以采用TClientDataSet的RefreshRecord函数,他不管当前有没有修改未决的修改,都可以刷新当前的记录,使当前的记录都是最新的,而日志中记载的修改则仍继续不保留.与Refresh函数不同的是,RefreshRecord函数只能刷新当前的记录.不过在使用RefreshRecord函数千万要注意:调用RefreshRecord函数有可能带来冲突.所以在调用RefreshRecord函数前,最好还是先检查以下当前是否有未决的修改.如果有就触发一个异常.
if (ClientDataSet1->UpdateStatus != usUnModified)
throw Exception("在刷新之前,必须提交记录");
ClientDataSet1->RefreshRecord();
thp 2004-09-14
  • 打赏
  • 举报
回复

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧