ado+access中,如何解决access自增字段中序号连续的问题?---关税有分。(200分)

  • 主题发起人 主题发起人 ldaan3
  • 开始时间 开始时间
L

ldaan3

Unregistered / Unconfirmed
GUEST, unregistred user!
如有10条记录。
当我把第三条记录删除,要求后面的序号都保持连续,不能中断。
同样,插入时后面的序号也都要保持序号连续。
应该如何做呢?
数据有1万条左右。
是单机版,不是C/S。
 
这样做有意义吗, 你的目的是什么呢
 
晕,如果是自增字段是不行的,要实现得用非自增长整型,且每删除一个或插入一个都
得改其后的所有记录!!!不知道用这个有什么用?
 
倒,这个也有用啊?
推荐你这么做:
function GetRecNo(tbl:TDataSet):Integer;
var
key:Integer;
begin
key := tbl.Fields[0].Value;//主键
tbl.first;
result := 1;
while tbl.Fields[0].Value <> key do
begin
inc(result);
tbl.Next;
end;
end;
 
尝试一下多功能啊,没办法,老板要求,为了三斗米而折腰。
我想假如这样的话,就有可能每做一次数据调整(删除,增加等),都必须对整个数据源
做一次滚动, 1 万的数据,呵呵,再快也要20秒吧,这样的话,老板不是骂死???
 
update set no=:no-1
parambyname('no').asstring:=刚删除得编号
update set no=:no+1
parambyname('no').asstring:=刚插入得编号
 
to ldaan3:
>>都必须对整个数据源做一次滚动
为什么要滚动?一个update语句就搞定了,时间不会超过一秒。
另外:用自增字段是行不通的。
 
建议不要采用access的自增字段,用程序控制建立一个包含id的字段,insert时候程序控制将
字段的id加1
 
既然是自增字段,那就不会受你控制。还是设置一个非自增字段吧。
 
好像必须用自增量自段啊,我以前作过一个准考证的程序,这个问题就把我搞的很烦。
 
to:mywyn
怎么update法呢?
例如表如下:(adoconnection1、adoquery1、datasource1、dbgrid)
序号 姓名 年龄
1 小明 20
2 小东 30
3 小红 28
4 小放 34
5 小华 42
... ... ...
我把第四个 ,即小放这个删除,如何把序号变为:1、2、3、4呢?
直接用自增字段,就会是:1、2、3、5 的结果。
希望给code。
 
to:视觉音乐
那后来怎么解决呢?
 
当删除时
update tablename set no=no-1 where no>4
当然这里的4是你删除的字段的序号
 
用自增字段是不可能的!
 
但是这样会报错,说是参数 j 没有默认值。
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
j:=0;
j:=adoquery1.Fields[0].AsInteger;
adoquery1.Delete;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('update 111 set 序号=序号-1 where 序号>j');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from 111');
adoquery1.Active:=true;
end;
 
where 序号>'+inttostr(j)
 
再次说明,不能是自增型字段
 
呵呵,ysai,你错了,
where 序号>'+inttostr(j) 这样是不行的。
报错inttostr 没有被定义。
我这里的试验,都没有用到自增字段。
 
不能直接用where 序号>inttostr(j)的
要写成:adoquery1.SQL.Add('update 111 set 序号=序号-1 where 序号>:aa');
adoquery1.Parameters.ParamByName('aa').value:=j;
就可以了,呵呵,祝你好运![8D]
 
where 序号>'+''''+inttostr(j)+''''
 
后退
顶部