向数据库插入一条记录后,如何获取记录的自增ID(AutoId)值?

时间:2022-08-27 21:47:25
我用TADOCommand执行一条插入命令,我想在插入成功后,取得新插入记录的AutoId值。

4 个解决方案

#1


这个ID值是和要插入的数据一块进入数据库的,要取得它,必须执行一次查询

#2


针对sql server,其他数据库不知道:D
插入成功后,立即
SELECT IDENT_CURRENT('表名') AS ID

#3


转载一篇文章:

SELECT IDENT_CURRENT(tableName)和自增长列的纠结  项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键ID值,用在插入子表时获取主键ID。在网上搜了一下,发现SELECT IDENT_CURRENT(TableName)这个语句可以实现。可是后来发现这个语句存在一个致命问题。

 

问题如下:(表中数据都为空)
(情况一)

当新建表数据为空时, IDENT_CURRENT(TableName)返回值为1.这时主表数据插入成功后,主表自增长列会自动赋值 1 

(情况二)

   当新增一条数据并删除后, IDENT_CURRENT(TableName)返回值还是1,可是现在主表插入成功后,主表自增长列会自动赋值2,而插入子表的主表ID还是1,这样就会导致主表和子表的关联字段不一致。

 

  在网上找了几个解决方案:

1.     DBCC CHECKIDENT (tableName, RESEED, 1) 

重置表的标示种子为1,可是在‘情况二’下,数据库还是会以 2 赋给主表ID字段,而不是1

2.     DBCC CHECKIDENT (tableName)

在”情况一”下输出为:

检查标识信息: 当前标识值'null',当前列值'null'。

在”情况二”下输出为:

检查标识信息: 当前标识值'1',当前列值'1'。

虽然根据输出信息不同,当数据表空时可以判断是‘情况一’还是‘情况二’,可是在C#中无论用ExecuteNonQuery, ExecuteScalar还是datatable返回的都是空数据 

 

    郁闷了一个下午始终没有找到答案,最后发现用下面的方法可以实现在子表中插入主表最新记录的ID值。 直接将“CONVERT(INT,IDENT_CURRENT('SalesInfo'))”作为主键ID的值添加到子表sql语句即可

如INSERT INTO PayInfo(SID) VALUES(CONVERT(INT,IDENT_CURRENT('STable')))

#4


各位层主辛苦了,楼主也辛苦了,正好我也遇到这个问题,前来学习下,大家回答的好认真,真心感谢各位

#1


这个ID值是和要插入的数据一块进入数据库的,要取得它,必须执行一次查询

#2


针对sql server,其他数据库不知道:D
插入成功后,立即
SELECT IDENT_CURRENT('表名') AS ID

#3


转载一篇文章:

SELECT IDENT_CURRENT(tableName)和自增长列的纠结  项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键ID值,用在插入子表时获取主键ID。在网上搜了一下,发现SELECT IDENT_CURRENT(TableName)这个语句可以实现。可是后来发现这个语句存在一个致命问题。

 

问题如下:(表中数据都为空)
(情况一)

当新建表数据为空时, IDENT_CURRENT(TableName)返回值为1.这时主表数据插入成功后,主表自增长列会自动赋值 1 

(情况二)

   当新增一条数据并删除后, IDENT_CURRENT(TableName)返回值还是1,可是现在主表插入成功后,主表自增长列会自动赋值2,而插入子表的主表ID还是1,这样就会导致主表和子表的关联字段不一致。

 

  在网上找了几个解决方案:

1.     DBCC CHECKIDENT (tableName, RESEED, 1) 

重置表的标示种子为1,可是在‘情况二’下,数据库还是会以 2 赋给主表ID字段,而不是1

2.     DBCC CHECKIDENT (tableName)

在”情况一”下输出为:

检查标识信息: 当前标识值'null',当前列值'null'。

在”情况二”下输出为:

检查标识信息: 当前标识值'1',当前列值'1'。

虽然根据输出信息不同,当数据表空时可以判断是‘情况一’还是‘情况二’,可是在C#中无论用ExecuteNonQuery, ExecuteScalar还是datatable返回的都是空数据 

 

    郁闷了一个下午始终没有找到答案,最后发现用下面的方法可以实现在子表中插入主表最新记录的ID值。 直接将“CONVERT(INT,IDENT_CURRENT('SalesInfo'))”作为主键ID的值添加到子表sql语句即可

如INSERT INTO PayInfo(SID) VALUES(CONVERT(INT,IDENT_CURRENT('STable')))

#4


各位层主辛苦了,楼主也辛苦了,正好我也遇到这个问题,前来学习下,大家回答的好认真,真心感谢各位