如何得到刚刚插入数据的id(50分)

  • 主题发起人 主题发起人 少爷的拐杖
  • 开始时间 开始时间

少爷的拐杖

Unregistered / Unconfirmed
GUEST, unregistred user!
说来惭愧,以前曾经看到过这样的帖子。需要的时候确查找不到:(
一个表有id,aa,bb三个字段,用以下代码插入一条记录
.....
ADOConn..BeginTrans;
ADOComm:=TADOCommand.Create(Self);
ADOComm.Connection:=Form1.ADOConn;
ADOComm.CommandText:='Insert Into Login_User (aa,bb) Values ('''+Edit1.Text+''','''+Edit2.Text+''')';
ADOComm.Execute;
//这里需要得到刚插入记录的id号,以便根据这个id号往另一张表中插入多条记录
......
ADOConn.CommitTrans;
......
因为取id值时事务尚未提交,我怕用select Max(id)得不到需要得值。
在插入前select max()也不行,因为id值不一定连续
请问该如何得到id值?
 
Is the problem cache?
 
用个变量记录一下。这里还没有提交成功。
引用这个变量好了
 
to Nizvoo:
请详细说说。怎么引用变量?我拿什么值赋给它啊
 
To 少爷的拐杖

你的id是自动增长的吗?
如果是的,那么你在处理这笔事务前可以得到那个最大的吧
那么按你插入的条数可以推断出ID
 
to Nizvoo:
如果我删除了几条记录后再加入记录,那么此时id不连续,我得到的id值+1不一定等于
插入记录后真正的id值。关键是这个问题。
 
用触发器呀,MSSQL的触发器里有Inserted表中可查到新的记录。然后可以设成你自己想要的。
 
to kkyy:
没提交CommitTrans也行吗?以前见过用@开头的一个什么词来读取的
 
用存贮过程来做吧。在SQL server中可以用
@@identity全局变量得到新插入记录的ID号。
用存贮过程还能得到其它的好处,何乐而不为?
 
我还是建议:
自己建个表
1.锁住记录
2.读出值
3.将值加1
4.将上述工作放在一个事务中,如果事务成功的话,取得的值应一唯一的。这样的话什
么都好办了。
 
用adoquery吧
adoquery.sql.add('Insert Into Login_User (aa,bb) Values ('''+Edit1.Text+''','''+Edit2.Text+''')';
adoquery.sql.add('select @@identity as newid');(记得要把select和insert放在一起,
要不然取得的@@identity可能就已经改变的了)
adoquery.active:=true;(因为要返回一个newid,所以换个adoquery这种可以返回记录集的组件)
然后要访问新的id就用adoquery.fieldbyname('newid').asinteger;
 
我也遇到过,不过我是又多建了一个字段做为关联外键!(没用ID,没提交我得不到该值)
关注@!@
 
如果是用AdoQuery或AdoDataSet,并用它本身的Insert等方法操作的话
在post后直接取最后一条记录的字段Id的值是可以取到新增的id值的
即使事务还未提交
如:
ADOConn..BeginTrans;
AdoDataSet.Insert;
......
AdoDataSet.Post;
AdoDataSet.Last;
iId := AdoDataSet.FieldByName('id').AsInteger; //取值
......
ADOConn.CommitTrans;
 
其实还是把insert和select语句放在一起比较保险一点。
几乎每个asp的例子都这样示范的
 
一定要用存储过程,在INSERT INTO 语句之后,马上取得@@identity的值。我做过这样的
东西。你要的话,回复一声,我明天贴一个例子上来(现在不在手边)。

honghs的做法也对,只不过是一个查询。
 
用触发器Inserted
或@@identity全局变量
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=098117
 
谢谢各位。我想honghs的答案是我所想要的。
 
select @@identity into :orderno
 
后退
顶部