delphi 併發取資料庫id問題

2022-01-13 23:26:44 字數 1789 閱讀 1263

這段時間有個專案id頻繁出現 id衝突的問題 一真找不到原因 後來想到了個辦法 在新建取id時先把到到的id儲存起來

上** 望大神指點下

/// /// 到表中的最大id

///

/// 欄位名--必須是int型

/// 表名

/// 臨時資料集

/// 字段

///

function tmainform.getmaxid(fld, tbl: string; qrytmp: tadoquery; rdtype: string): string;

vars, 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語句如下:

/// /// 執行sql語句

///

/// 資料集

/// sql語句

/// 是否執行open

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;

資料庫併發

資料庫併發定義 乙個處理機處理乙個事務,系統允許多個處理機處理多個事務,稱為併發 併發引起的影響 1.修改丟失 事務1和事務2同時操作某條資料,比如機場共有機票16張,事務1賣出一張後修改為15,同時事務2也賣出1張,修改為15,最後資料庫中票量為15,實際只剩14個座位 2.不可重複讀 事務1第一...

資料庫id自增長

1.建立序列 create sequence create sequence innerid minvalue 1 maxvalue 99999999999999 start with 1 increment by 1 cache 20 order 2.innerid.currval 指當前序列 i...

Delphi 壓縮Access資料庫

由於access資料庫在反覆使用過程中會自動增大,delphi壓縮access資料庫的簡單方法如下 首先要引用comobj單元 function tform1.compac b const dbfile,pwd string boolean var tempdbfile string constr ...