三层架构中客户端用ClientDataSet新增记录时如何定位? ( 积分: 100 )

  • 主题发起人 主题发起人 dreamisx
  • 开始时间 开始时间
D

dreamisx

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在试着写一个三层架构的东东(只是练习一下),现在实现客户端时遇到一个问题:
1、用 ClientDataSet.Append;
新增一条记录,用户输入一些信息,然后点保存按钮;
2、保存时用以下代码:
with ClientDataSetdo
begin
CheckBrowseMode();
//确保已修改的数据真正能保存
if CheckRecordValid() then
//如果数据检查有误,则不保存 2005.2.3
begin
if ChangeCount >
0 then
begin
BeforeSaveRecord();
//保存前做一些事
ApplyUpdates(-1);
//提交
AfterSaveRecord();
//保存完做一些事
end;
//...
end;
end;
诸位大侠请注意了,对于不是新增的记录(进行修改的记录)CheckBrowseMode执行后,当前记录位置不变,但当是新增记录时,执行CheckBrowseMode之后,ClientDataSet就跑到表尾去了,且新增的记录无法用Locate等方法定位!也就是说,其后执行CheckRecordValid时已无法得到正确的结果!非得ApplyUpdates()后才能定位到原先新增的记录处!
请问,有什么办法可以处理这种情况,即在CheckBrowseMode后可定位到新增记录处?
 
我正在试着写一个三层架构的东东(只是练习一下),现在实现客户端时遇到一个问题:
1、用 ClientDataSet.Append;
新增一条记录,用户输入一些信息,然后点保存按钮;
2、保存时用以下代码:
with ClientDataSetdo
begin
CheckBrowseMode();
//确保已修改的数据真正能保存
if CheckRecordValid() then
//如果数据检查有误,则不保存 2005.2.3
begin
if ChangeCount >
0 then
begin
BeforeSaveRecord();
//保存前做一些事
ApplyUpdates(-1);
//提交
AfterSaveRecord();
//保存完做一些事
end;
//...
end;
end;
诸位大侠请注意了,对于不是新增的记录(进行修改的记录)CheckBrowseMode执行后,当前记录位置不变,但当是新增记录时,执行CheckBrowseMode之后,ClientDataSet就跑到表尾去了,且新增的记录无法用Locate等方法定位!也就是说,其后执行CheckRecordValid时已无法得到正确的结果!非得ApplyUpdates()后才能定位到原先新增的记录处!
请问,有什么办法可以处理这种情况,即在CheckBrowseMode后可定位到新增记录处?
 
CheckBrowseMode 怎么操作的?
是不是也用到了这个 ClientDataSet?
 
CheckBrowseMode()是你自己的过程吧。你不贴出代码来,谁知道里面做了什么呢。
 
CheckBrowseMode为TDataSet的一个方法,TClientDataSet当然也有这个方法,不是我自己写的,因为新增后不用它就不能使新增记录起作用.
 
http://www.playicq.com/dispdocnew.php?id=22781
你下载看看,
我的取数与回添全是用函数实现的
 
我从来不用ClientDataSet,直接运行sql
 
to liuxiangsoft
你的不是源代码呀,我配置运行不起来,提示套接子,只能使用端口一次错误
的什么错误?
 
用函数或SQL我知道怎么做,不过那样就不能利用TClientDataSet的强大功能了;
不过还是感谢以上各位的帮助;
继续等待中……
 
你 要先将我的那个程序运行起来再说,
我的QQ:405090991
 
问题很可能出在CheckBrowseMode里,只要访问cds的状态,可能就会引起其状态的改变。这时你再去检查它的状态,可能得到的结果与你想要的就不一样了。想得到答案:要么把自定义的几个方法贴出来,要么自己去好好研究MIDAS。
 
谢谢各位的帮助与提醒,问题原因我已找到:
数据库我用的是MSSQL,各数据库表的主键应该用的是自增列(identity);
我是用Power Designer设计数据库的,结果有些表没设置好,而我当时就为每个DataSetProvider挂上了OnUpdateData事件,在这个事件中,我一开始是这样写的:
void __fastcall TxHotelRdm::dspGeneralUpdateData(TObject *Sender,
TCustomClientDataSet *DataSet)
{
const int iKeyCount = 5;
AnsiString asKeyIDs[] = {"KeyID", "BillID", "ItemNo", "ID", "SecondID"};
for(int i=0;
i <
iKeyCount;
i++)
{
if(DataSet->FindField(asKeyIDs))
{
DataSet->FieldByName(asKeyIDs)->ProviderFlags.Clear();
DataSet->FieldByName(asKeyIDs)->ProviderFlags <<
pfInKey;
//注意,这里只用了pfInKey!
}
}
}
后来才发现,在pfInKey后加上 <<
pfInUpdate就可以了!
不过今天我才发现,根本就不需要UpdateData事件!只要设置好主键就可以了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部