ClientDataSet中的主键冲突问题!! ( 积分: 100 )

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

linfox

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ClientDataSet取得服务器上的表数据(该表有自动编号字段为主键),在界面编辑时,需要insert多条记录后一起提交数据库,但是自动编号字段不需要用户填写。这样以来在ClientDataSet中就会产生key violation异常(因为自动编号字段都为空)。应该如何处理这样的情况才能实现在有主键的ClientDataSet中批增加后提交啊???
 
我用ClientDataSet取得服务器上的表数据(该表有自动编号字段为主键),在界面编辑时,需要insert多条记录后一起提交数据库,但是自动编号字段不需要用户填写。这样以来在ClientDataSet中就会产生key violation异常(因为自动编号字段都为空)。应该如何处理这样的情况才能实现在有主键的ClientDataSet中批增加后提交啊???
 
在onNewRecord事件中写
Dataset.FeildVlaue{'xxx']:=0;
然后提交忽略对自增字段的处理(将TDatasetProvider.ResolveToDataset设成False),并且在AppluUpdates后,立即刷新记录,已获取服务器对此自增字段的真正的序号值。
 
DataSet.FieldValue['id']:=0,关键是Id是自增字段,不允许修改。而且就算是:=0,那多条记录时还是因为都:=0而产生key violation啊!!
 
自己维护主键,比如(有一个主键字段 ID:varchar(38) )等 只要在客户端用 use comobj
........在onNewRecord事件中写
begin
Dataset.FeildVlaue{'xxx']:=createclassID;
end;
 
设置自增字段的ClientDataset.TField.ReadOnly属性为false
可以在窗体中声明一个变量,随便赋一个值,然后每赋值一次就Dec(变量)或Inc(变量)一下。
我在DbExpress+dataProvoder+ClientDataSet的方式时,将所有自增记录都置0是没问题的。不知道到你用什么连接
 
to levi:
我的连接是ado+dataprovoder+clientdataset+access,自增字段定义为主键。这个错误只是在clientdataset中就出现了,还没有到dataprivoder端。所以在clientdataset中出现多条主键相同的记录是不允许的。
to yf168:
用个GUID来填写clientdataset中的自增字段好象很勉强啊,而且我的id是integer类型的,有没有自动产生不重复数字类型的函数?
 
请看清楚我的回答!
比如(有一个主键字段 ID:varchar(38) )等 只要在客户端单元引用comobj,
use comobj
........在onNewRecord事件中写
begin
Dataset.FeildVlaue['id']:=createclassID;(createclassid是一个函数,全球唯一的)
end;
 
用ClientDataSet取得服务器上的表数据,也可以考虑不获取Id字段值.只获取其他用户可以编辑的字段组成的数据集.
不用客户端维护的字段,为什么想方设法要让客户端来维护值呢.
 
karlong的话有的道理,但有时候我们又确实需要在Client端得到自增id号,又该如何处理呢。
如有以下四表
题库表 id,题型,知识点,试题,....(所有id均为自增自段)------->A
备选答案表 id,pid,备选项,备选内容 (外键pid-->题库表.id)------>B
题库附件表 id,pid,附件名,附件 (外键pid-->题库表.id)------>C
外挂改卷程序表 id,pid,程序名,程序 (外键pid-->题库附件表.id)-->D
在中间层做了主从表 主A--------从B
|________从C 同时又是主表C-----从D
在客户端如何获取A、C表的id值。
 
1:在中间层服务器上的DataSet建立永久性字段,然后将自增性字段的ProviderFlags属性设为[pfInWhere]
2:在中产层服务器上的TDataSetProvider控件的BeforeUpdateRecord事件中写入:
if updatekind=ukinsert then
DeltaDS.FieldByName('Add_ID').ProviderFlags:=DeltaDS.FieldByName('Add_ID').ProviderFlags-[pfinkey]
else
DeltaDS.FieldByName('Add_ID').ProviderFlags:=DeltaDS.FieldByName('Add_ID').ProviderFlags+[pfinkey];
//Add_ID指自增性字段
这样即可在客户端实现批量修改与提交
 
后退
顶部