【问题标题】:IDENT_CURRENT returns NULLIDENT_CURRENT 返回 NULL
【发布时间】:2013-01-12 21:55:20
【问题描述】:

在我的代码中 DR.HasRows() 返回 True,但 DR("LastID") 返回 DBNUllSELECT 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

【问题讨论】:

  • 你到底为什么关心最高 ID 是多少?你打算如何处理这些信息?我希望您不要在其中添加 1 并假设新值将是下一个插入的值...

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我不想假设会生成下一个 ID。在 INSERT 之后,我想将页面重定向到刚刚创建的 ID page.asp?ID=blah.
  • @Maysam 然后选择 SCOPE_IDENTITY();插入后立即
  • 我得到的是,如果在一个独立的函数中使用它,它可以工作。
【解决方案2】:

来自MSDN

在 SQL Server 中,用户只能查看安全对象的元数据 用户拥有或已被授予权限的用户。这 表示生成元数据的内置函数,例如 IDENT_CURRENT 如果用户没有任何权限 对象。

你可能会觉得这很有趣:

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

【讨论】:

  • @Maysam:通过 Mgmt Studio 和程序连接时,您使用的是同一个帐户吗?
  • @Neoilsk 是的,它是同一个帐户。但它们在同一台机器上运行
  • @Maysam:你能试试SELECT IDENT_CURRENT ('SiteSection')GetLastID = DR(0)吗?
【解决方案3】:

检查这个.. Ident_Current returning NULL on SQL 2005

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多