|
发表于 2008-4-2 18:17:58
|
显示全部楼层
这是取流水号的函数
static function TCOMMONUTILS.GetAutoIncreaseID(AContext: TContext;ACodeID, ACodeRemark: string): string;
const
CODESCOPE = '自动递增序列'; // 通用编码表中的编码类型
SQLText = 'SELECT * FROM TCOMMONCODE WHERE (FSCOPE = :FScope) AND (FCODE=:FCode)';
UpdateSQLText = 'UPDATE TCOMMONCODE SET FCONTENT = :FCONTENT where (FSCOPE = :FScope) AND (FCODE=:FCode)';
InsertSQLText = 'INSERT INTO TCOMMONCODE (FSCOPE, FCODE, FCONTENT, FDESCRIPTION) VALUES (:FScope, :FCode, :FCONTENT, :FDESCRIPTION)';
CODEFIELD = 'FCODE';
SCOPEFIELD = 'FSCOPE';
CONTENTFIELD = 'FCONTENT';
DESCRIPTIONFIELD = 'FDESCRIPTION';
var
lQuery: Business.Data.TQuery;
begin
lQuery := Business.Data.TQuery.Create(nil);
with lQuery do
try
ConnectionString := SysUtils.Format('DATABASEURL=%s', [TRTLConsts.CollaborationDatabaseURL]);
Close;
CommandText := SQLText; // 从通用编码表中取出当前编号的数据
Params.ParamByName(SCOPEFIELD).AsString := CODESCOPE;
Params.ParamByName(CODEFIELD).AsString := ACodeID;
Open;
if (not lQuery.IsEmpty) then
begin
Result := SysUtils.IntToStr(lQuery.FieldByName(CONTENTFIELD).ASInteger + 1); // 设置编码的自增量
Close;
CommandText := UpdateSQLText;
Params.ParamByName(CONTENTFIELD).AsString := Result;
Params.ParamByName(SCOPEFIELD).AsString := CODESCOPE;
Params.ParamByName(CODEFIELD).AsString := ACodeID;
Execute;
end else
begin
Result := '1'; // 设置编码的初始值
Close;
CommandText := InsertSQLText;
Params.ParamByName(SCOPEFIELD).AsString := CODESCOPE;
Params.ParamByName(CODEFIELD).AsString := ACodeID;
Params.ParamByName(CONTENTFIELD).AsString := Result;
Params.ParamByName(DESCRIPTIONFIELD).AsString := ACodeRemark;
Execute;
end;
finally
lQuery.Free;
end;
end;
从代码上看,确实有可能会由于并发访问导致重号。
楼主可以用考虑存储过程来完成以上逻辑,减少这种现象发生 的几率 |
|