delphi 中怎样返回SQL SERVER7.0 中具有IDENTITY属性的列值?(100分)

  • 主题发起人 主题发起人 czhysj
  • 开始时间 开始时间
C

czhysj

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个三层系统中,我在SQL SERVER 中建立一个工人工作表GRWORK,主要有如下字段及属性:
GRBH 工人编号 CHAR
CPBH 产品编号 CAHR
CPSL 产品数量 INT
UNIQUEBH 唯一编号 INT IDENTITY(1,1)
问题是这样:当我在客户端中输入一条记录如(‘1121’,‘12345’,100),然后用APPLYUPDATES(0)提交之后,
我在客户端中的UNIQUEBH这列中却无SERVER在UNIQUEBH中
产生的列值返回而仍然是一个空值,造成某些操作不能完成,而必须重新从SQL SERVER 中获取数据才有这列的数值,但这样做会造成网络负荷加重。如果用@@idetity 系统变量每次都读数据库,在多用户环境可能具有延时且加大网络负荷,因为我的数据表有800多万条记录,请问在多用户环境中有什么办法可以使我在提交数据时,自动获得SERVER 产生的IDENTITY列值,或者在多用户环境中有什么办法可以保证自动插入一个唯一值到数据库!谢谢赐教!
 
用触发器(参考delphi4编程技术内幕p399)
 
不用CACHEUPDATE,直接POST好象是可以的。
 
ApplyUpdate后,用Refresh。但有许多限制:
1。ChangeCount = 0
2。在服务器端,要有一定的限制条件
如有更好的方法,请通知我:
bjzhq@263.net
 
不好获得,也不用获得,用refresh动作太大了,
自己临时产生一个id吧。
 
Paradox 单机版上用 Post 可以马上从数据集中取出来 Identity 型字段值。
如果在多用户环境下,建议你换一种录入方式,用 TQuery + Insert SQL 语句,比如:
Query1.SQL.Add('Insert Into Table FieldList ValueList');
Query1.SQL.Add('Select @@Identity');
Query1.Open;
ID := Query1.Fields[0].AsInteger;
在 Query 中一次写两条语句,实际上起到了 SP 的效果,当然你自己写一个 SP 也可以。
 
Thanks BaKuBaKu!
对单一记录是可以的,但对批记录却又无可奈何(如:一个帐单有多个帐目,
是要一次提交的,即:要么都成功,要么都失败,此时只能对该单Refresh).
请问BaKuBaKu,是否有更好的办法(SQL Server7.0下)
多谢!!
朱鹤群 2000.12.11
 
用存储过程把@@identify放到一个临时表中,事务成功后读出来可以吗?
 
还有一个方法,插入记录用存储过程,在表中多定义一个字段int,先insert记录,
在存储过程中,再update 这个int字段,可以马上返回值
 
Thanks gydc!
我是用Delphi中的多表打包技术的,即一个DS中包含了二个DS,用存储过程也是个办法
(指在表中增加一个int型字段),但不好实现,因为Delphi做了封装,再反回去一是不方便,
二是没必要.
如果提交后, 在从数据库中提回, 增加了网络负载. 基于此,便没有使用自动增加ID号
功能,而是定义为 INT 类型, 从库中获取下一个ID值, 在客户端的DS中进行标识所谓的ID,
然后提交,好处减少了网络负载,缺点是不能偷懒了.
朱鹤群 2000.12.12
 
多人接受答案了。
 
后退
顶部