ID字段是自动编号,用ADOquery新插入一条记录,如何在插入前就能取得这条记录的ID? (50分)

  • 主题发起人 主题发起人 chemstar
  • 开始时间 开始时间
C

chemstar

Unregistered / Unconfirmed
GUEST, unregistred user!
ID字段是自动编号,用ADOquery新插入一条记录,如何在插入前就能取得这条记录的ID?
 
ADOQuery1.Fields[0].AsInteger
ADOQuery1.Fields[0].AsString

 
Post之后马上就可以取了,另一种方法
用于SQLSERVER或ACCESS200及以上版本:
语法
@@IDENTITY
返回类型
numeric
注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生
的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若
插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句
激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY
将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制
失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。
在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和
IDENT_CURRENT 函数类似。
@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但
是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何
会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。
示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
 
你可以在插入前就记下这条记录的id
 
adoquery1.sql.clear;
adoquery1.sql.add('select max(id) from CD')
adoquery1.open;
currentid=adoquery1.fields[0].value;
 
其实你自己写的就可以了。

最后那里:
inttostr()
 
如果是插入之后,也就是POST后就可以取了,那个ID值就是你要的ID,也就是FieldByName('ID').asinteger,
但要你的数据库引擎支持
 
Post之后马上就可以取
 
插入一条空记录,得到id
如果取消,删除它;如果保存,用update语句把数据更新。
 
to ysai,
有两点问题:
1、Access是不是不支持 @@IDENTITY ?
2、能否给我一个能用的例子?反正我是怎么也通不过。你看下面错在哪儿?
   ADOQuery := TADOQuery.Create(Self);
ADOQuery.Connection := Form1.ADOConn;
ADOQuery.SQL.Add('Insert Into Login_User (用户名,密码) Values (''' + Edit1.Text + ''',''' + Edit2.Text + ''')');//插入记录
ADOQuery.Sql.Add('Select @@identity As NewId');//得到插入的id号,id是自增字段
ADOQuery.Open;
NewId := ADOQuery.FieldByName('NewId').AsString;
ADOQuery.Free;
一运行就提示SQL结束的地方缺少“;”,而我加入分号后,又说在SQL结束的地方发现了字符。真是莫名其妙。
3、也就说两条或几条SQL连起来用,到底应该怎么写?


 
with aqr do
begin
SQL.Clear;
SQL.Add('insert into 订单 (单据号,客户) values (''1234'',''A公司'');');
ExecSQL;//必须
SQL.Clear;
SQL.Add('Select @@identity As NewId');
Open;
ShowMessage(Fields[0].AsString);
end;
两条或几条SQL连起来用不能有Select,也就是说不能有结果,只能用ExecSQL
而且每条SQL之间要用分号分隔开
 
插入前把数据库中最大的ID号取出来,再加上STEP不就OK了!
 

Similar threads

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