问一个数据库操作的经典问题 ^_^

james_pizza 2004-12-22 11:05:12
假如我有一表,表中有个字段m_nID是一个标示字段,并且是自增的。

当我对这张表插入新的纪录的时候:

CMySet set; //CMySet public from CRecoderSet,specialed for the table ^-^
set.open()
set.AddNew()
//fill other field but not the m_nID
set.m_m_strName="James";
set.m_m_nOld=23;
//OK,now let's update
set.Update()
set.close();

问题是:我想获得我这条刚刚添加的纪录的m_nID值,该如何做呢?
土办法:在上面的代码后面,加上:
set.open();//reopen it
set.MoveLast();//move to last record -_-!
int nResult=set.m_nID;//so get the m_nID i want.
set.close()
这样的做法在单一用户的情况下,是觉得没有问题的。但是如果时多用户并发的时候就会有问题。
可能会出现,获得的ID不是我刚刚添加的,而是别人刚刚添加的!

另一个办法:
利用SQL:
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
但是,显然这两条SQL也是有先后的。

请大家帮助我,谢谢。
...全文
202 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
firewing 2005-01-21
  • 打赏
  • 举报
回复
不Close不就行了吗?
yaoha2003 2005-01-20
  • 打赏
  • 举报
回复
对表进行锁定,先读得最大序号,我们要写的记录就是这个序号+1
objectman 2005-01-20
  • 打赏
  • 举报
回复
在Oracle中,先取得序列值,再去添加记录。
jun_01 2005-01-19
  • 打赏
  • 举报
回复
IDENT_CURRENT 类似于 Microsoft® SQL Server™ 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。这三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。


@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。


SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
jun_01 2005-01-19
  • 打赏
  • 举报
回复
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
========================================
如果是在sql Server中,可以保证@@identity的值是正确的.
jinxuliang 2005-01-18
  • 打赏
  • 举报
回复
这两条语句放到一个事物中不就解决了吗?
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
----------------------------------------
不过我记得上面的问题在sql数据库版里,提供了一个语句,在一个sql里完成,你查查.不要分开写的
zengtang 2004-12-22
  • 打赏
  • 举报
回复
如果 是多用户的可以在open的时候增加条件即操作用户编号之类的
liudancodeman 2004-12-22
  • 打赏
  • 举报
回复
不会,但帮你顶
tigerVC 2004-12-22
  • 打赏
  • 举报
回复
要保证你的记录是录前的,那么你在打开记录集时就选择是adOpenStatic然后你在不关闭记录集的前提下先把新加的记录ID打到。然后在COLOSe这样应该不会出错吧。

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧