对于自增主键如何从中间层返回(200分)

  • 主题发起人 主题发起人 king.gray
  • 开始时间 开始时间
K

king.gray

Unregistered / Unconfirmed
GUEST, unregistred user!
ClientDataset为离线状态,数据修改后将Delta传给中间层。
中间层使用DataSetProvider.ApplyUpdates更新数据。
问题:
由于表中使用了自增字段,对于新增的数据,在客户端ClientDataSet.MergeChangeLog
之后这个字段值仍为空,请问有何方式可以在中间层更新完数据后回传这个字段值。
 
select @@identity
 
自增字段/有默认值的字段是三层杀手
用ClientDataSet的话,最好就不要用它们
李维的书上建议在中间层生成ID,而不是数据库生成
 
中间层如何生成.
李维 哪本书上说 自增字段是三层杀手了
 
建议根据日期时间产生一个唯一的字符串来替代自增字段^_^
 
我现在的做法是,不用自增字段,为了维护这个主键,我建立了一个表用于存放最新的键值.
通过中间层的一个方法来获得和维护这个主键.客户端调用这个方法.
这个方法每次调用都实时更新这个表.但是我担心这个方法在并发时会取到重复值,
是不是在取值时加锁.或者有没有其它更好的方法.我的数据库是SQL.
 
to:king.gray
你这种做法是对的
你在中间层的取ID方法中,要用一个互斥变量来防止并发用户在同一时刻会取到重复值的可能。
 
取值时加上排它锁就可以了,只有一个用户可以使用排它锁
 
可这样做,与使用自增自段 有什么不同吗.是处理方便吗.在保存从表时,就可以取得ID,而不用等到主表保存后再取得ID.可以这样理解吗
 
COM+中有个对象是可以共享全局变量的,忘了叫什么名字了
不用把最大ID存到表里,只需用全局共享变量记录最大ID,每次+1再取就是最新ID了,COM+会保证互斥访问的
 
to 肥羊. 如果服务器突然出现问题,不及时保存不好吧.还是存在表里安全些吧
 
在中间层中用时间+序号,自己去维护,
不要用自增的,用自的增的话在做表关联时是自找麻烦。
并且对于后期的维护,数据的迁移也不方便。
 
三层中最好不要用自增字段,这样导致客户端死机的
 
直接就用
insert 表 (sh,……)values((select nvl(max(xh),0)+1 from 表),……)
 
三层确实不太好用自增字段,我的解决办法是每个表的主健都是GUID
 
自增字段的关键是使用时机问题.
我做的多层中,大量使用了自增字段序号,还没有产生问题.
 
多人接受答案了。
 

Similar threads

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