2009-06-18 101 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. 

如果行從表身份和鍵刪除這不會打破不連續的。

希望有所幫助。

相關問題