2009-06-18 51 views
3

我有一个AutoIncrement列的数据表。如何在不添加新行的情况下获得列的下一个增量(-1,-2,-3,...)?获取数据表列的下一个自动增量值?

+0

我只是好奇,为什么你需要这样做? – 2009-06-18 17:32:22

+0

我有一个父母和一个子表或一个零或一个关系。我想要显示DataGridView,它将有两列的列,并显示来自Parent的所有行,不管它是否有Child,但子元素(本质上是2列)仍然必须是可编辑的。因此,如果一个孩子已经存在,编辑一个现有孩子的子列将产生一个数据库编辑,但是编辑一个不存在的孩子将产生一个插入。我不需要为插入生成ID(因为它们是临时的),但是这可能需要用于将来的扩展 – Rado 2009-06-18 17:53:26

回答

6

如果它符合您的设计,您总是可以创建新行(datatable.newrow),并且它已经分配了nextId。它现在被浪费了,但是直到AcceptChanges之前,这行并没有被委托给桌面。

-2

由于自动增量值始终是该列中的最大值,因此您可以使用max(列名)+1来获取它。

+0

如果添加了一行然后删除了它,这将不起作用。也就是说,我没有回答这个问题。 – 2009-06-18 17:21:31

+0

或者如果AutoIncrementStep与1不同。易于考虑,但仍受到daughtkom笔记的限制。 – hometoast 2009-06-18 17:24:52

+3

自动增量值并不总是最大的值。事实上,对于使用负面Ids的客户端添加的行的增量为-1,这是一种常见模式,在更新时由数据库中的值替换。 – Joe 2009-06-18 18:36:58

1

您可以在Select方法中针对DataTables使用MAX函数。

喜欢的东西(语法可能不完全正确):

DataRow row = dt.Select("MAX(id)")[0]; 
int nextId = row["id"] + 1; 

MSDN与所有可以使用表达式的页面。 DataColumn..::.Expression Property

1

我有一个带有 AutoIncrement列的数据表。

你有一个带有AI列或带有AI列的SQL数据库的数据表吗?如果它是具有该列的SQL数据库,则无法获取下一个值,因为您的DataTable已断开连接。否则,您必须等待,直到您执行插入并使用@@ IDENTITY或类似的功能。

0

如果您正在使用SQL Server,你可以这样做:

SELECT cast(last_value as integer)+cast(increment_value as integer) 
FROM sys.identity_columns 
WHERE object_id=(SELECT id FROM sys.sysobjects WHERE name='PACLogErros') 
AND name='ERRCod' 
0

最好的办法是安德鲁提到,因为我们不能推断在SQL计算下一个身份算法使用@@ IDENTITY和如果你想多个人更新数据库,你计算出,当您尝试行保存到数据库

7

我得到了解决问题的方法(不是周围的工作)不会是相同的标识值:

要获得下一个auto-i从SQLServer的ncrement值:

SELECT IDENT_CURRENT('table_name'); -- This will fetch the present auto-increment value. 

因此,

SELECT IDENT_CURRENT('table_name')+1; -- Next auto-increment value. 

如果行从表身份和键删除这不会打破不连续的。

希望有所帮助。

相关问题