AutoInc ID问题

 SQL SERVER的Indentity字段映射到Delphi时,默认类型是TAutoIncField,它继续自TIntegerField,在实际使用时,有些常见的问题需要处理(假设字段名是AutoID):
1、新记录保存后,如果CursorLocation = clUseClient时,AutoID字段值不会自动返回,必须Refresh后取回。如果CursorLocation = clUseServer时,AutoID字段的表现与MS Access一样,保存后会自动刷新(一般不使用该方式)。
2、该字段默认为只读(Readonly = True),将该字段的Readonly 设为 False,就可以进行修改了,但是保存不了(Post时自动会置为空值,呵呵)。如果想显示修改AutoID字段,则在打开数据集前,将对应表的 IDENTITY_INSERT 设为ON,关闭数据集后,再设为OFF,例如:
With FADOQuery do begin       
   SQL := 'SET IDENTITY_INSERT TableName ON'  + sLineBreak  + 'Select * from TableName';
   Open;
   Append;
   FieldByName('AutoID').Value := 1056; //想设置的自动ID的值,注意别重复喽
   .....
   Post;
   Close;

   SQL := 'SET IDENTITY_INSERT TableName OFF' ;  //记得关闭状态
   ExceSQL;
end;

3、有AutoInc字段的记录如何AppendRecord,如有三个字段,AutoID,cCode,cName,则写成:
AppendRecord([ nil , 'aaa' , 'bbb' ]);  //注意:是nil不是Null。

4、获取新的AutoID值:
procedure NewAutoIncID(ATblName: string);
var 
  i: integer;
begin 
  Result := 1;
  FQuery.SQL := Format('SELECT IDENT_CURRENT(''%s'')',[ATblName]);
  FQuery.Open;
  i := FQuery.Fields[0].AsInteger;
  Result := i + 1;
end; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值