1

在我的代码中DR.HasRows()返回True,但在SQL Management Studio 中工作时DR("LastID")返回。DBNUllSELECT IDENT_CURRENT ('SiteSection') AS 'LastID'

__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

4 回答 4

4

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

也就是说,我发现你的方法充其量是有问题的。您打算如何处理来自 的信息IDENT_CURRENT()?如果您认为您可以接受并假设您尚未执行的操作IDENTITY将产生什么价值,请再想一想。INSERT有几个因素可以使该假设无效 - 有人可以同时重新设定身份,或更改增量,或插入一堆行。

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

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

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

于 2013-01-13T02:47:40.220 回答
3

来自MSDN

在 SQL Server 中,用户只能查看用户拥有或已被授予权限的安全对象的元数据。这意味着如果用户对对象没有任何权限,则生成元数据的内置函数(如 IDENT_CURRENT)可能会返回 NULL 。

你可能会觉得这很有趣:

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

于 2013-01-12T22:06:44.810 回答
2

检查这个.. Ident_Current 在 SQL 2005 上返回 NULL

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

于 2013-01-12T22:05:00.490 回答
0

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

     SELECT COALESCE((SELECT top(1) IDENT_CURRENT('TableName')),0) +1 as NextId
于 2018-04-29T10:48:37.563 回答