不使用CreateParam返回SCOPE_IDENTITY()

时间:2012-04-10 02:03:51

标签: asp-classic vbscript adodb

我正在尝试此操作,但在使用此代码ADODB.Recordset error '800a0e78' Operation is not allowed when the object is closed.

的行中收到错误If ScopeID.EOF Then

请不要回答使用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

%>

5 个答案:

答案 0 :(得分:5)

试试这个:

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

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

答案 1 :(得分:3)

在命令之后应用.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

%>

答案 2 :(得分:1)

如果您正在运行SQL Server的现代版本(我认为这是关于病房的2005),您可以使用输出子句:

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

答案 3 :(得分:0)

你的连接是否开放?看起来这就是错误消息所抱怨的内容。您无法对已关闭的连接执行命令。

答案 4 :(得分:0)

将您的查询分为两部分:

INSERT INTO TABLE (NAME) VALUES ('test'); SELECT SCOPE_IDENTITY() AS ID

注意;。我认为你的查询的第二部分没有被执行。