每次新录入时必须要从数据库里取出最小的,但这样的话多用户同时录入时就会出问题,大家怎么解决的?(不能保存的瞬间生成id号,因为有的用户需要自己录入)
解决方案 »
- 这是为什么呢?
- D6、D7中调用WebService如何控制超时?
- ADO的那些数据集控件ADOtable 的filter属性中如果使用DateDiff来计算日期差的。
- 高分请教,如何做一个有焦点的超链接控件?
- 如何在Delphi程序中对Windows图元文件进行读写
- 请教:如何利用delphi在sql 2000server中建立数据库?
- 小软件发布(可以写日记、听mp3、通讯录、理财、提醒)兼散分,敬请意见于我,谢谢各位同仁们啦!
- delphi中调用webservice时,出错,请大虾帮忙~~~
- 动态数组和静态数组的一点疑问
- 怎样才能将一个MDIChild的FORM永远放在最底层?
- <Delphi 6 从入门到精通 > 翻译得极其差,大家千万不要再花冤枉钱了。
- 为什么我的程序发送短信的速度这么慢?急救。。。在线等候
每当maindb执行插入操作时,都调用这个query的requery属性,重新找到ID最大值,然后,把最大值的值自动加1,赋给新插入的字段就可以了
用户自己改就用
update table
set bh='000000'
来连接数据源。 其它的adoquery,adocommond,连接到这个adoconnection
上,当多用户同时操作。
用行锁和,事务进行控件了。Try
Adoconnection.beginstran;
adoquery1.append; //or edit;
adoquery1('id'):=Getmax(id); //调用这个取最大 id过程.
adoquery1.fieldbyname('field').asstring:='aaa';
adoquery1.post;
adoconnection.commition;
except
adoconnection.rollback;
//在这里根据相应的ado错误 代码进行控件了.
showmessage('其它用户正在操作此记录'); //关键字重复。等等了.
end;少用dbedit,用edit来取代edit. 将锁定时间做到最少。配上select * from table where / unlock;用条件。
这样同一时间保存id就不会重复。
那么你可以用全局临时表法,
用原表名加你的ID创建一张临时表,
当另外的用户来新增时取一个ID,
如果这个ID没有全局临时表,
则表明这个ID没有其它用户在用,
如果有全局临时表,则ID加1再判断,
本方法用的是全局临时表的一个特性,
当创建者的连接断开后,全局临时表自动删除!但是你的系统如果是用多层做的,
则不能用本方法,本方法只适用于C/S结构!
procedure ***
var
IDmax: Integer;
sID: string;
begin
with ADOQuery1 do
begin
try
Close;
SQL.Clear;
SQL.Add('Select Max(ID) as IDmax from ***');
Open;
IDmax:=FieldByName('IDmax').AsInteger;
if IDmax<9 then sID:='00'+InttoStr(IDmax+1)
else if (IDmax>=9) and (IDmax<99) then sID:='0'+InttoStr(IDmax+1)
else sID:=InttoStr(IDmax+1);
try
Close;
SQL.Clear;
SQL.Add('Insert into *** (ID) values ('+sID+')');
ExecSQL;
finally
Close;
end;
finally
Close;
end;
end;
end;
这应该是个常见问题呀,请有经验的出招。谢谢
select max(Id) from maindb update nowait;
进行锁记录操作。这样多用户也没问题!
2 其次你可以另设一个字段(哪怕是增加一个字段)作为表主键
3 如果1 中提到的字段需要一个默认值的话,让程序生成一个默认值show给用户,供他修改
4 至于表主键怎么生成,楼上有很多同仁都已作出回答
5 祝你成功!
难点: 第一个。最后一个。中间删掉的(不能重复的)补充。
解决方法:一个一个与数据库作比较。每一次加一。如果是第一个赋值为一。
procedure TFormJLB.UserLsh();//自己定义的人员流水号码。
var m:Integer; //定义两个int型变量
b:Integer;
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select personID from person ORDER BY personID');//做降序排列。
Query1.Open;
Query1.First;//从排列的第一个开始
b:=1;
if Query1.RecordCount=0 then Edit1.Text:=IntToStr(1)//如果没有第一个,则Edit1为1。
else
begin
while not Query1.Eof do //如果没有到最后一个,开始。
begin
m:=Query1.FieldByName('personID').Value;//让m等于循环到的流水号。
if b<>m then //如果b不等于m的话
begin
break; //跳出循环
end;
b:=b+1;
Query1.Next;//Query1继续循环
end;
Edit1.Text:=IntToStr(b);//Edit1等于b
end;
Edit1.Enabled:=false;
begin
with query do
begin
close;
sql.clear;
unprepare;
sql.add('select max(id) as Mid from TableX');
prepare;
open;
if recordcount>0 then
edit1.text:=inttostr(fieldbyname('Mid').asinteger+1);
else
edit1.text:='00001';
end;
end;
按下"新增时调用这个过程,会取得ID,用户也可以自已在EDIT1.TEXT中输入