Asp classic 返回作用域_IDENTITY(),而不使用CreateParam

Asp classic 返回作用域_IDENTITY(),而不使用CreateParam,asp-classic,vbscript,adodb,Asp Classic,Vbscript,Adodb,我正在尝试此操作,但得到一个错误ADODB。当对象关闭时,不允许执行记录集错误“800a0e78”操作。在带有此代码的行上如果ScopeID.EOF,则 请不要回答使用CreateParam方法,寻找没有此方法的解决方案。谢谢 <% set Cmd = Server.CreateObject("ADODB.Command") Cmd.ActiveConnection = conn Cmd.CommandText = "INSERT INTO TABLE (NA

我正在尝试此操作,但得到一个错误
ADODB。当对象关闭时,不允许执行记录集错误“800a0e78”操作。
在带有此代码的行上
如果ScopeID.EOF,则

请不要回答使用
CreateParam
方法,寻找没有此方法的解决方案。谢谢

<%  
    set Cmd = Server.CreateObject("ADODB.Command")
    Cmd.ActiveConnection = conn

    Cmd.CommandText = "INSERT INTO TABLE (NAME) VALUES ('test')  SELECT SCOPE_IDENTITY() AS ID"
    Cmd.CommandType = 1
    Cmd.CommandTimeout = 0
    Cmd.Prepared = true

    Set ScopeID = Cmd.Execute()

    If ScopeID.EOF Then
        Response.Write "There was an Error in your request, Please try again"
        Response.End
    Else
        ID= ScopeID(0).Value
    End IF

    ScopeID.Close
    Set ScopeID = Nothing
    Set Cmd = Nothing

    Response.Write ID

%>


您的连接打开了吗?这似乎就是错误消息所抱怨的。无法对关闭的连接执行命令。

将查询分为两部分:

INSERT INTO TABLE (NAME) VALUES ('test'); SELECT SCOPE_IDENTITY() AS ID
注意
。我认为您的查询的第二部分没有执行。

请尝试以下操作:

Cmd.CommandText = "SET NOCOUNT ON; INSERT INTO TABLE (NAME) VALUES ('test'); SET NOCOUNT OFF; SELECT SCOPE_IDENTITY() AS ID"

据我所知,如果SETNOCOUNT ON未将实际insert语句“隐藏”,SQL Server将返回一个(空)记录集。我认为错误消息指的是正在关闭的记录集,而不是连接

在命令完成后应用
.NextRecordSet()

<%  
    set Cmd = Server.CreateObject("ADODB.Command")
    Cmd.ActiveConnection = conn

    Cmd.CommandText = "INSERT INTO TABLE (NAME) VALUES ('test')  SELECT SCOPE_IDENTITY() AS ID"
    Cmd.CommandType = 1
    Cmd.CommandTimeout = 0
    Cmd.Prepared = true

    Set ScopeID = Cmd.Execute()
            ScopeID.NextRecordSet() // <---- Fix

    If ScopeID.EOF Then
        Response.Write "There was an Error in your request, Please try again"
        Response.End
    Else
        ID= ScopeID(0).Value
    End IF

    ScopeID.Close
    Set ScopeID = Nothing
    Set Cmd = Nothing

    Response.Write ID

%>

如果您运行的是SQL Server的现代版本(我想是在wards上的2005),那么可以使用output子句:

Cmd.CommandText = "insert into [dbo].[test] (name) output inserted.id values ('test')"

是否应使用
set Cmd.ActiveConnection=conn
设置连接?不,没有
set
部分可以正常工作。检查下面链接中Robert Wagner的回复,您会说没有打开连接的错误将出现在
set ScopeID=Cmd.Execute()上
line?我相信错误消息听起来像是一个关闭的连接。当您显式打开连接时,此错误是否消失?对于关闭的记录集,会给出相同的消息。在本例中,查询不会返回打开的记录集,因此,在尝试评估EOF时出现了错误。Set ScopeID=ScopeID。NextRecordSet()是为我做的