我的代码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
答案 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