не может получить scope_identity после вставки в классическом asp - PullRequest
1 голос
/ 19 мая 2011

Я должен сделать быстрое и грязное хранилище сеансов sql для классического asp, поэтому у меня есть следующая хранимая процедура, которая выполняет вставку.Когда я запускаю его из sql management studio или через 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

Ответы [ 3 ]

0 голосов
/ 20 мая 2011

Ваша хранимая процедура потребует пару изменений, если вы хотите вернуть SCOPE_IDENTITY в наборе записей.То, как это в настоящее время реализовано, IDENTITY возвращается как параметр RETURN_VALUE, который вы должны получить, используя объект ADO Command.Возвращаемое значение будет первым параметром в коллекции Command.Parameters .См. Пример article .

Если вы хотите вернуть результаты в наборе записей, попробуйте изменить строку

set @ID = SCOPE_IDENTITY()

на

SELECT SCOPE_IDENTITY() AS NEW_ID

и удаление оператора возврата.

0 голосов
/ 03 апреля 2014

Просто используйте

set nocount on ; 

Ваш запрос вставки Sql с ";"

set nocount off ;

И используйте метод ниже

Set rsInsert = conn.execute(SQLQuery)


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

Работает нормально.Я проверял.

0 голосов
/ 19 мая 2011

Использование RETURN в вашем сохраненном процессе обычно используется для возврата статуса или кода ошибки. Если вы хотите вернуть данные в виде набора записей из вашего сохраненного процесса, используйте SELECT вместо RETURN.

Обновление: Звучит так, как будто до сих пор не доходит, что ваша хранимая процедура теперь возвращает набор записей. Согласно документации MSDN для команды ADO:

Если команда не предназначена для возврата результатов (например, запрос SQL UPDATE), поставщик ничего не возвращает, если указана опция adExecuteNoRecords; в противном случае Execute возвращает закрытый набор записей.

...