2013-01-12 27 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