2013-01-12 46 views
1

在這裏,在我的代碼DR.HasRows()回報True,但DR("LastID")回報DBNUllSELECT IDENT_CURRENT ('SiteSection') AS 'LastID'作品在SQL Management Studio中。IDENT_CURRENT返回NULL

__SQLString= "SELECT IDENT_CURRENT ('SiteSection') AS 'LastID'" 
Dim DR As SqlDataReader 
ddConnect() 'It's my custom class that opens a connection to db, it works 
DR = ddExecuteReader() 
DR.Read() 
If DR.HasRows() Then 
    GetLastID = DR("LastID") 
End If 
+4

爲什麼地球上你最關心的是什麼是最高的ID?你將如何處理這些信息?我希望你不會添加1,並假設新值將被插入下一個... –

回答

4

我懷疑你的.NET應用程序正在使用的帳戶沒有相同的權限帳戶使用的是通過管理Studio連接。

這就是說,我覺得你的方法充其量是有問題的。你打算如何處理來自IDENT_CURRENT()的信息?如果您認爲您可以採取這種做法,並假設您尚未執行的INSERTIDENTITY值將會產生,請再考慮一下。有幾個因素可能會導致這種假設無效 - 有人可以在此期間重新識別身份,或者更改增量或插入一堆行。

所以我建議你重新考慮你需要做什麼以及爲什麼你認爲IDENT_CURRENT是做到這一點的方法。根據您的意見,您應該發送:

INSERT ... ; SELECT LastID = SCOPE_IDENTITY(); 

現在您可以確定這是您插入的ID。

+0

我不想假設會生成下一個ID。在INSERT之後,我想將頁面重定向到剛剛創建的ID,page.asp?ID = blah。 – Maysam

+2

@Maysam then SELECT SCOPE_IDENTITY();立即*插入後。 –

+0

我得到的是,如果使用它在一個獨立的功能,它的作品。 – Maysam

3

MSDN

在SQL Server中,用戶只能查看 用戶擁有或上該用戶已被授予權限的安全對象的元數據。此 表示如果用戶在 對象上沒有任何權限,則元數據發送內置函數(如IDENT_CURRENT )可能會返回NULL。

您可能會發現這個有趣的:

當IDENT_CURRENT值爲NULL(因爲表從未 包含行或已被截斷)時,IDENT_CURRENT函數 返回種子值。

+0

但我可以使用SELECT/INSERT和其他命令 – Maysam

+0

@Maysam:你是否在使用相同的帳戶時通過Mgmt Studio和程序連接? – Neolisk

+0

@Neoilsk是的,這是同一個帳戶。但他們運行在同一臺機器 – Maysam