插入经典 ASP 后无法scope_identity



我必须为经典asp进行快速而脏的sql会话存储,因此我有以下存储过程来完成插入工作。 当我从 sql 管理工作室或通过 asp 代码运行它时,它插入正常,但它没有返回scope_identity。 奇怪的是,当我从代码执行该过程时,我在检查 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

ASP代码是...

set cnLocal = GetConnection()
    cnLocal.open()
    set rs = cnLocal.execute("exec InsertSessionValue '" & SessionKey & "','" & SessionValue & "'")
    if not rs.eof then
        id = rs(0)
    end if
    rs.close: set rs = nothing
    end if
    cnLocal.close: set cnLocal = nothing

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

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

如果该命令不打算返回结果(例如,SQL UPDATE 查询),则只要指定了选项 adExecuteNoRecords,提供程序就会返回 Nothing;否则,Execute 将返回已关闭的 Recordset。

如果要在记录集中返回SCOPE_IDENTITY,则存储过程将需要进行一些更改。当前实现 IDENTITY 的方式作为RETURN_VALUE参数返回,您必须使用 ADO 命令对象检索该参数。返回值将是 Command.Parameters 集合中的第一个参数。有关示例,请参阅以下文章。

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

set @ID = SCOPE_IDENTITY()

SELECT SCOPE_IDENTITY() AS NEW_ID

并删除返回语句。

只需使用

set nocount on ; 

您的 sql 插入查询带有 ";"

set nocount off ;

并使用波纹管法

Set rsInsert = conn.execute(SQLQuery)

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

它工作正常。我测试过。

最新更新