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,则写成:
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;