IDENT_CURRENT返回NULL

时间:2013-01-12 21:55:20

标签: .net sql sql-server vb.net sql-server-2008

我的代码DR.HasRows()在此处返回True,但DR("LastID")返回DBNUll,而SELECT IDENT_CURRENT ('SiteSection') AS 'LastID'在SQL Management Studio中有效。

__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 个答案:

答案 0 :(得分:4)

我怀疑您的.NET应用程序使用的帐户与您通过Management Studio连接的帐户具有相同的权限。

那就是说,我发现你的方法充其量是有问题的。您打算如何处理来自IDENT_CURRENT()的信息?如果您认为自己可以采取这种做法并假设尚未为IDENTITY生成的INSERT值,那么请再想一想。有几个因素会使这个假设无效 - 有人可以在此期间重新设置身份,或者更改增量,或插入一堆行。

所以我建议你重新考虑一下你需要做什么以及为什么你认为IDENT_CURRENT是这样做的。根据您的评论,您应该发送:

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

现在您可以确定这是您插入的ID。

答案 1 :(得分:3)

来自MSDN

  

在SQL Server中,用户只能查看安全性的元数据   用户拥有或已授予用户权限的用户。这个   表示元数据发射,内置函数,如IDENT_CURRENT   如果用户没有任何权限,则可能会返回NULL   对象

您可能会觉得这很有趣:

  

当IDENT_CURRENT值为NULL时(因为表从不   包含行或已被截断的IDENT_CURRENT函数   返回种子值。

答案 2 :(得分:2)

检查一下.. Ident_Current returning NULL on SQL 2005

  

使用ident_current或任何其他函数来获取最后一个   身份,用户需要具有读取元数据的权限,所以它   在该数据库上需要 db_onwer

答案 3 :(得分:0)

如果因为在使用下面的代码之前没有插入行而返回null,则它假定种子值为1:

     SELECT COALESCE((SELECT top(1) IDENT_CURRENT('TableName')),0) +1 as NextId