大家好~~~ ADO控制 ACCESS, 我先Insert,在我POST 之前怎么得到自增长字段的值呢? 详情请进入。(50分)

  • 主题发起人 主题发起人 txl2001
  • 开始时间 开始时间
T

txl2001

Unregistered / Unconfirmed
GUEST, unregistred user!
 ADO控制 ACCESS, 在表中有一自增长字段, 我想在插入一条记录的时候,用自增长字段的值作为流水号的一部分,但是在提交前自增长字段的值总是0, 请问各位如何解决。
 
POST之前是无法取得自增ID的,必须POST后才行
这就是自动编号的缺点,认命吧

偶的数据库设计原则:
没主键是等死,字段有默认值(包括自增字段)是找死!
 
多谢了,难道真的是没有办法了么? 这样岂不是郁闷了。
 
最得id的最大值
 
最得id的最大值 是个好方法,然后自增1
但是好像自增的id是不能保存的,不如自己做个算法生成id
 
最得id的最大值也就是上一条的ID.然后+1就计算出本条的ID了。然后你就可以用来做你的流水号的一部分了。
 
我都是 select Max(id)
然后加1
 
我都是 select Max(id)
然后加1
-------------
多用户并发时不行.
 
你可以这样做:先插入内容。插入以后用这条语句:select @@ID ID是自增字段的名称
我在sql server中可以的。access没有试过。
 
select Max(id) 然后加1 ??!!
假如原有最大的ID那条记录被删除了呢?这样还加1吗?
 
别用自增字段,自己用代码写,自增字段很容易出现中间空缺,浪费资源,养成习惯每一个都设计好,好控制
 
大家说得很好,谢谢大家。散分了。。。
 
{此函数放在 afterpost 之前 }
procedure TBSelectIDByBase(ADataSet:TADODataSet;AID:string;Base:integer;
var RID:integer);
{ 找出表 ADataSet中字段AID非连续的值以Base 为基 如:若从"0"开始,则
Base 为-1 RID 为全局变量, 得到的是缺失第一个编号。 比如:base:=0 ,已有编号AID为:
1 2 4 5 6 7 9.... Rid将得到 3, 若3post后 下一次将得到 8, 记录倒在内存运行,用2分法,速度很快
}


procedure TBSelectIDByBase(ADataSet:TADODataSet;AID:string;Base:integer;var RID:integer);
var
i,j,k:integer;
StSort:string;
begin
k:=1;
ADataSet.DisableControls;
StSort:=ADataSet.Sort;
ADataSet.Sort:=AID+' ASC';
try
i:=ADataSet.RecordCount;
if i=0 then
begin
RID:=base+1;
exit;
end;
ADataSet.Last;
if i=ADataSet.FieldByName(AID).AsInteger-base then RID:=i+base+1
else
if i=0 then RID:=base+1
else
begin
j:=i div 2;
ADataSet.First;
while (j>1)or(j<-1) do
begin
ADataSet.MoveBy(j);
if k+j>i then k:=i
else if k+j<1 then k:=1
else k:=k+j;
if k=ADataSet.FieldByName(AID).AsInteger-base then
j:=abs((j div 2)+(j mod 2))
else j:=-abs((j div 2)+(j mod 2));
end; // while (j>1)or(j<-1)
case j of
-1:begin
while (k<>ADataSet.FieldByName(AID).AsInteger-base)and(k<>1) do
begin
ADataSet.Prior;
dec(k);
end;
if k=ADataSet.FieldByName(AID).AsInteger-base then RID:=k+1+base
else RID:=base+1;
end;{end -1}
1:begin
while (k=ADataSet.FieldByName(AID).AsInteger-base)and(k<>i) do
begin
ADataSet.Next;
inc(k);
end;
if k<>ADataSet.FieldByName(AID).AsInteger-base then RID:=k+base
else RID:=i+1+base;
end;{end 1}
0:if ADataSet.FieldByName(AID).AsInteger=1+base then RID:=2+base
else RID:=1+base;
end;{end case}
end;
finally
ADataSet.Sort:=StSort;
ADataSet.EnableControls;
end;
end;

procedure TBSelectID(ADataSet:TADODataSet; AID:string;var RID:integer);
var
i,j,k:integer;
StSort:string;
begin
k:=1;
ADataSet.DisableControls;
StSort:=ADataSet.Sort;
ADataSet.Sort:=AID+' ASC';
try
i:=ADataSet.RecordCount;
if i=0 then
begin
RID:=0;
exit;
end;
ADataSet.Last;
if i=ADataSet.FieldByName(AID).AsInteger then RID:=i+1
else
if i=0 then RID:=1
else
begin
j:=i div 2;
ADataSet.First;
while (j>1)or(j<-1) do
begin
ADataSet.MoveBy(j);
if k+j>i then k:=i
else if k+j<1 then k:=1
else k:=k+j;
if k=ADataSet.FieldByName(AID).AsInteger then
j:=abs((j div 2)+(j mod 2))
else j:=-abs((j div 2)+(j mod 2));
end;
case j of
-1:begin
while (k<>ADataSet.FieldByName(AID).AsInteger)and(k<>1) do
begin
ADataSet.Prior;
dec(k);
end;
if k=ADataSet.FieldByName(AID).AsInteger then RID:=k+1
else RID:=1;
end;{end -1}
1:begin
while (k=ADataSet.FieldByName(AID).AsInteger)and(k<>i) do
begin
ADataSet.Next;
inc(k);
end;
if k<>ADataSet.FieldByName(AID).AsInteger then RID:=k
else RID:=i+1;
end;{end 1}
0:if ADataSet.FieldByName(AID).AsInteger=1 then RID:=2
else RID:=1;
end;{end case}
end;
finally
ADataSet.Sort:=StSort;
ADataSet.EnableControls;
end;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部