Asp classic 在经典asp中插入后无法获取作用域\u标识

Asp classic 在经典asp中插入后无法获取作用域\u标识,asp-classic,vbscript,ado,Asp Classic,Vbscript,Ado,我必须为经典asp做一个快速而脏的sql会话存储,所以我有以下的存储过程来执行插入工作。当我从sqlmanagementstudio或通过asp代码运行它时,它可以很好地插入,但不会返回scope\u标识。奇怪的是,当我从代码中执行过程时,当对象在检查rs.eof的行中被关闭时,不允许执行操作 create procedure InsertSessionValue @keyname varchar(50), @value varchar(max) as declar

我必须为经典asp做一个快速而脏的sql会话存储,所以我有以下的存储过程来执行插入工作。当我从sqlmanagementstudio或通过asp代码运行它时,它可以很好地插入,但不会返回scope\u标识。奇怪的是,当我从代码中执行过程时,当对象在检查rs.eof的行中被关闭时,不允许执行操作

create procedure InsertSessionValue

    @keyname varchar(50),
    @value varchar(max)

as

    declare @ID int
    delete from storedsessionsimple where datesaved < dateadd(d, -1, getdate())

    insert into dbo.StoredSessionSimple (SessionKey, SessionValue, DateSaved) values (@keyname, @value, getdate())

    set @ID = SCOPE_IDENTITY()

    return @ID
在存储过程中使用RETURN通常用于返回状态或错误代码。如果要从存储的进程中以记录集的形式返回数据,请使用SELECT而不是return

更新:您的存储过程现在正在返回一个记录集,这听起来好像仍然没有发现。根据ADO命令的MSDN文档:

如果该命令不打算返回结果,例如,只要指定了adExecuteNoRecords选项,提供程序的SQL更新查询将不返回任何结果;否则,Execute将返回一个关闭的记录集


如果要在记录集中返回SCOPE_标识,则需要对存储过程进行一些更改。当前实现标识的方式是将标识作为返回值参数返回,您必须使用ADO命令对象检索该参数。返回值将是集合中的第一个参数。请参见下面的示例

如果要在记录集中返回结果,请尝试更改行

set @ID = SCOPE_IDENTITY()

并删除返回语句。

只需使用

set nocount on ; 
您的Sql插入查询带有

set nocount off ;
并采用波纹管法

Set rsInsert = conn.execute(SQLQuery)


if not rsInsert.EOF then
   response.write(rsInsert(0))
end if

它很好用。我测试过。

对。好电话。但不幸的是,我仍然在if not rs.eof then行上出现对象关闭错误。即使在存储过程中使用SELECT而不是RETURN?是的,我已经做了更改,但仍然会出现相同的错误。有趣。那么,您知道如何让它获取更新吗?当您从ServerManagementStudio执行存储过程时,现在是否获得了值?
set nocount off ;
Set rsInsert = conn.execute(SQLQuery)


if not rsInsert.EOF then
   response.write(rsInsert(0))
end if