在三層結構中,如何更恰當地處理自動增值字段(MS SQL)??? (100分)

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

dragonx23

Unregistered / Unconfirmed
GUEST, unregistred user!
各位,我也有一疑問:如果系统要求在服务器或网络故障时客户机也能要求独立运行,并且
數據表dailysz的字段Keyid定義為Identity Increment=1時(即定義一個自動增加1的主鍵)
,那么如何實現客戶端的Clientdataset與Sqlserver數據庫同步??? 因為Clientdataset與
服務器斷開連接后,當新增append時,其Keyid默認為從1開始或空.但更新到Sqlserver數據庫后,
Sqlserver數據庫的Keyid值為XXXX,而此時Clientdataset的Keyid的值仍為1.如何同步???
 
我认为只要断开就没法同步
 
在服务端:把datasetProvider的poPropogateChange设为TRUE;
在它的BeforeUpdateRecord中写:
DeltaDs.FieldByName('MyField').NewValue:=GetNewId;
//GetNewId是你在数据库中的序列(GenId.NextVal)中读得的下一个值
applied:=False;
在客户端的clientDataSet的beforePost中:
ClientDataSet1.FieldByName('MyField').AsInteger:=GetTmpId;
//GetTmpId是你在客户端生成的一个临时的唯一ID(在一个客户端唯一就可以);
 
jeff168: 謝謝你的回復,我按照你提供的方法試了,運行后出現"Field 'Keyid' Cannot be
Modified"警告框.如何解決? 是了,我想問一下:你這種方法是否支持斷開方式,字段結構是
否定義了Identity Increment,其實之前我也用類似的方法試過,但是較難對SourceDS:
TDataSet;
DeltaDS: TCustomClientDataSet;這兩個對象進行賦值.
 
KEYID字段你要声明为INTEGER类型呀.(不可以是自动增长的)
至于在服务端获得NEWID就要看你的了,
如用ORACLE,INTERBASE你可以用生成器.
如果没有生成器你可以用一个表+存储过程来完成.
一般来说你不在数据库上用TRIGER,且保证唯一都可以了,
因为这样你在DELPHI里不知道在数据库里主键已经被改成了其它
值.
 
后来都不用自增字段了
 
to jeff168:
其實我開始也這樣認為,但KEYID字段一定要用自动增长类型.這個不是我決定的.你看
還有沒有別的方法.這也一種技朮嘛!
 
多人接受答案了。
 
后退
顶部