码迷,mamicode.com
首页 > 数据库 > 详细

delphi 并发取数据库id问题

时间:2015-04-18 11:26:57      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

这段时间有个项目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;

 

delphi 并发取数据库id问题

标签:

原文地址:http://www.cnblogs.com/SoftWareIe/p/4437003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!