Возврат SCOPE_IDENTITY() с помощью Adodb.Command

У меня есть оператор Insert (хранимая процедура), который возвращает SCOPE_IDENTITY() после вставки, однако я пытаюсь выяснить, как вернуть его после использования запроса ADODB.Command в классическом ASP.

В SP это включено в конце:

SET @LastID = SCOPE_IDENTITY() -- @LastID is an INT OUTPUT param.

Вот что вызывается при обработке запроса Insert в классическом ASP-коде:

set SQLCOMM = Server.CreateObject("ADODB.Command")
SQLCOMM.ActiveConnection = CONNSTRING
SQLCOMM.CommandText = "Insert_SP_Returns_ScopeID"
SQLCOMM.CommandType = 1
SQLCOMM.CommandTimeout = 0
SQLCOMM.Prepared = true

LastIDParameter = SQLCOMM.CreateParameter("@LastID",adInteger,adParamOutput)
SQLCOMM.Parameters.Add(LastIDParameter)

SQLCOMM.Execute() 

LastID = LastIDParameter.Value

set SQLCOMM=Nothing

Я просто делаю что-то подобное перед тем, как set SQLCOMM=Nothing ?

NewID = SQLCOMM("LastID").Value

ИЛИ... может ли хранимая процедура вставки/обновления быть выполнена из Adodb.Recordset вместо ADODB.Command?

    The example above gives the following error message:
    ADODB.Command error '800a0bb9'

    Arguments are of the wrong type, are out of acceptable range, 
    or are in conflict with one another. 

Ошибка возвращается из-за этой строки кода:

LastIDParameter = SQLCOMM.CreateParameter("@LastID",adInteger,adParamOutput)

person Wilkins    schedule 30.08.2011    source источник


Ответы (1)


Ваш командный подход к вызову хранимой процедуры в порядке. Все, что вам нужно сделать, это добавить дополнительный выходной параметр к объекту команды. (Я не делал никаких vbscript в течение многих лет, поэтому я не уверен, следует ли вам явно вводить свои переменные).

В сценарии ВБ

set SQLCOMM = Server.CreateObject("ADODB.Command") 
SQLCOMM.ActiveConnection = CONNSTRING 
SQLCOMM.CommandText = "Insert_SP_Returns_ScopeID" 
SQLCOMM.CommandType = 1 
SQLCOMM.CommandTimeout = 0 
SQLCOMM.Prepared = true 

Dim LastIDParameter
Dim LastID

LastIDParameter = SQLCOMM.CreateParameter("@LastID",adInteger,adParamOutput)
SQLCOMM.Parameters.Add(LastIDParameter)

SQLCOMM.Execute() 

LastID = LastIDParameter.Value

set SQLCOMM=Nothing 

А затем в вашей хранимой процедуре.

CREATE PROCEDURE Insert_SP_Returns_ScopeID

@Value1 int,
@Value2 int,
@LastID int OUTPUT

AS

INSERT INTO TableName(Value1,Value2) VALUES (@Value1,@Value2)

SET @LastID = SCOPE_IDENTITY()

РЕДАКТИРОВАТЬ: вам может потребоваться найти значения adInteger, adParamOutput и использовать их, поскольку константы могут быть не определены для вашей среды. Если да, то используйте...

SQLCOMM.CreateParameter("@LastID",3,2)

или определить константы.

person David Steele    schedule 30.08.2011
comment
На самом деле, я получаю сообщение об ошибке: Ошибка ADODB.Command '800a0bb9' Аргументы имеют неправильный тип, выходят за пределы допустимого диапазона или конфликтуют друг с другом. СТРОКА, ВЫЗЫВАЮЩАЯ ОШИБКУ: LastIDParameter = SQLCOMM.CreateParameter(@LastID,adInteger,adParamOutput) - person Wilkins; 30.08.2011