这段时间有个项目id频繁出现 id冲突的问题 一真找不到原因 后来想到了个办法 在新建取id时先把到到的id保存起来
上代码 望大神指点下
/// <summary>
/// 到表中的最大id
/// </summary>
/// <param name="fld">字段名--必须是int型</param>
/// <param name="tbl">表名</param>
/// <param name="qrytmp">临时数据集</param>
/// <param name="RdType">字段</param>
/// <returns></returns>
function TMainForm.GetMaxID(fld, tbl: string; qrytmp: tadoQuery; RdType: string): string;
var
s, cId, cCondition: string;
begin
cCondition := ' where cRdType = ' + quotedstr(RdType); s := 'select isnull(max(' + fld + '),0) +1 from ' + tbl; if RdType <> '' then
s := s + cCondition; DoQuery(qrytmp, s, true); cid := qrytmp.Fields[0].AsString; s := 'select count(1) from ' + tbl;
if RdType <> '' then
s := s + cCondition; DoQuery(qrytmp, s); if RdType <> '' then
begin
if qrytmp.Fields[0].AsInteger <= 0 then
begin
s := 'insert yq_GetMaxID (cRdType,cMaxid) values ('
+ quotedstr(RdType) + ',' + cid + ')';
DoQuery(qrytmp, s, false);
end else
begin
s := 'update yq_GetMaxID set cMaxID = ' + cid + cCondition; DoQuery(qrytmp, s, false);
end;
end; result := cid;
end;
yq_GetMaxID是建的一个临时表
如下:
create table yq_GetMaxID
(
id int identity primary key,
cRdType nvarchar(32) default '',--出入库类型
cMaxId int default 0 --这个地方应是i开头
)
执行sql语句如下:
/// <summary>
/// 执行sql语句
/// </summary>
/// <param name="adoquery">数据集</param>
/// <param name="strSQL">sql语句</param>
/// <param name="bOpen">是否执行open</param>
procedure TMainForm.DoQuery(var adoquery: TADOQuery; strSQL: string; bOpen: boolean);
begin
adoquery.close;
adoquery.sql.clear;
adoquery.sql.add(strSQL);
if bopen then
begin
adoquery.Open;
end else
adoquery.ExecSQL; end;