Проблема при получении переменной OUTPUT из хранимой процедуры SQL через ASP (классический VBSCRIPT) - PullRequest
1 голос
/ 15 февраля 2011

Я новичок здесь, и это мой первый пост. Я создал хранимую процедуру в SQL Server, которая имеет (4) входные параметры и (1) выходной параметр. Хранимая процедура используется для вставки или удаления записи в / из таблицы. Выходному параметру присваивается сообщение, которое будет возвращено на страницу ASP, чтобы обеспечить обратную связь относительно того, что произошло в хранимой процедуре. то есть. «Запись вставлена», «Запись уже существует» или «Запись удалена».

Когда я запускаю код с веб-страницы, записи добавляются и удаляются, как и должно быть. Единственная проблема, с которой я сталкиваюсь, заключается в получении выходного параметра для возврата значения.

Когда я выполняю хранимую процедуру из SQL Server Management Studio, отображается выходной параметр.

Я искал в интернете и проверил свой код по другим примерам. Я не уверен, почему иначе я не получил бы возвращенные значения. Любая помощь будет принята с благодарностью.

CREATE PROC My_Stored_Procedure
    -- Add the parameters for the stored procedure here

    @ContactID AS INT = '0', /* Contact ID relates to br_UID from the dbo.Reporting_Contacts table */
    @FacNum AS CHAR(4) = '0866', /* Facility Number from the Reporting Admin Page on Intranet */
    @EmployeeID AS CHAR(8) = '10023258', /* EmployeeID from the Reporting Admin Page on Intranet */
    @Delete AS CHAR(1) = 'N', /* Delete flag value to be passed from webpage on Intranet */
    @OutputMessage AS NVARCHAR(200) = 'test' OUTPUT /* To send back sucuess or error messages */

AS

BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.

    SET NOCOUNT ON;

    -- Set variables for use in Stored Procedure


    -- Insert statements for procedure here

IF  @Delete = 'N'

        BEGIN


IF @EmployeeID  NOT IN (SELECT HGISSN FROM Main)

BEGIN

Select * FROM dbo.Reporting_Contacts

SET @OutputMessage = 'Contact does not exist as an employee.'

END


IF @EmployeeID IN (SELECT employeeID FROM dbo.Reporting_Contacts WHERE EmployeeID = @EmployeeID AND FacilityNumber = @FacNum)


BEGIN

SELECT @OutputMessage = 2

PRINT @OutputMessage 

SET @OutputMessage =  'This Person is already a contact.'


END

IF @EmployeeID IN (SELECT HGISSN FROM dbo.EMP_Table) AND @EmployeeID NOT IN (SELECT employeeID FROM dbo.Reporting_Contacts WHERE EmployeeID = @EmployeeID AND FacilityNumber = @FacNum)

BEGIN

INSERT INTO dbo.Reporting_Contacts (employeeID, FacilityNumber, ContactLevel)

VALUES (@EmployeeID, @FacNum, 'S')

SET @OutputMessage = 'New Contact has been added.'

END

END


ELSE IF @Delete = 'Y'

        BEGIN


DELETE FROM dbo.Reporting_Contacts WHERE br_UID = @ContactID


SET @OutputMessage = 'Record Deleted'


END



END

SELECT @OutputMessage

GO

Это мой VBScript:

Dim addContacts__ContactID

addContacts__ContactID = "0"

if(Request("ContactID") <> "") then addContacts__ContactID = Request("ContactID")



Dim addContacts__FacNum

addContacts__FacNum = LEFT(Request.Form("FacilityNumber"),4)

if(Request("FacNum") <> "") then addContacts__FacNum = Request("FacNum")



Dim addContacts__EmployeeID

addContacts__EmployeeID = Request.Form("EmployeeID")

if(Request("EmployeeID") <> "") then addContacts__EmployeeID = Request("EmployeeID")



Dim addContacts__Delete

addContacts__Delete = "N"

if(Request("Delete") <> "") then addContacts__Delete = Request("Delete")




Dim strReturnMessage


set addContacts = Server.CreateObject("ADODB.Command")

addContacts.ActiveConnection = MY_STRING

addContacts.CommandText = "My_Stored_Procedure"

addContacts.CommandType = 4 'Evaluate as a stored procedure

addContacts.CommandTimeout = 0

addContacts.Prepared = true

addContacts.Parameters.Append addContacts.CreateParameter("@RETURN_VALUE", 3, 4)

addContacts.Parameters.Append addContacts.CreateParameter("@ContactID", 3, 1,10,addContacts__ContactID)

addContacts.Parameters.Append addContacts.CreateParameter("@FacNum", 129, 1,4,addContacts__FacNum)

addContacts.Parameters.Append addContacts.CreateParameter("@EmployeeID", 129, 1,8,addContacts__EmployeeID)

addContacts.Parameters.Append addContacts.CreateParameter("@Delete", 129, 1,1,addContacts__Delete)

addContacts.Parameters.Append addContacts.CreateParameter("@OutputMessage", 200, 2,200)


strReturnMessage =  addContacts.Parameters("@OutputMessage")

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

попробуйте что-то вроде этого

Function LoginUser()
    Dim cmd
    Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = dbconn
    With cmd
        .CommandText = "sproc_login"
        .Parameters.Append  .CreateParameter("@RETURN_VALUE", adInteger, adParamReturnValue)
        .Parameters.Append  .CreateParameter("@username", adVarChar, adParamInput,50,username)
        .Parameters.Append  .CreateParameter("@password", adVarChar, adParamInput,50,password)
        .execute
        strResponse = CInt(.Parameters(0).value )
    End With
    With Response
        If strResponse > 0 Then
            .Write strSuccess
        Else
            .Write strFailure
        End If
    End With
    Set cmd = Nothing
End Function

++ пример использования изменить только при необходимости ++

1 голос
/ 19 мая 2012

Вы используете ту же переменную, что и целое число и строку.Хранимая процедура имеет один определенный параметр OUTPUT - @OutputMessage.Эта переменная изменяется и возвращается хранимой процедурой.Именно эту переменную вы должны захватывать.Код в вашей хранимой процедуре сбит с толку.Вы хотите, чтобы @OutputMessage был строкой или целым числом?Как пример, посмотрите эти соседние строки в вашем SP:

SELECT @OutputMessage = 2

PRINT @OutputMessage  

SET @OutputMessage =  'This Person is already a contact.'

Первая строка рассматривает @OutputMessage как целое число (и что с использованием инструкции SELECT, когда достаточно инструкции SET?) Затем выпечать, нареканий нет.Затем вы устанавливаете его в текстовое значение (по крайней мере, на этот раз с оператором SET).

Обратитесь к определению SP, и он определяет параметр как: @OutputMessage AS NVARCHAR (200) ='test' OUTPUT Это не целое число.

Кажется, сценарий VB ожидает целое число, когда вы пытаетесь преобразовать результат, используя cint, и все же значением по умолчанию для переменной в SP является "test".

With cmd
    .NamedParameters = true 'Add this line to make things easier to read
    .CommandText = "sproc_login" 
    '.Parameters.Append  .CreateParameter("@RETURN_VALUE", adInteger, adParamReturnValue)  'This is useless and should be removed.
    .Parameters.Append  .CreateParameter("@username", adVarChar, adParamInput,50,username) 
    .Parameters.Append  .CreateParameter("@password", adVarChar, adParamInput,50,password) 

    .Parameters.Append (cmd.CreateParameter ("@OutputMessage",adInteger,adParamOutput)) 'This is the variable being returned so get it.
    .execute 
    'strResponse = CInt(.Parameters("@Output").value ) 'Confused - @OutputMessage is defined as NVARCHAR(200) - not INTEGER.
strResponse = .Parameters("@OutputMessage").value 'This is much better.
End With 

Код в области «с ответом» также запутан и должен быть переписан.

Путем устранения путаницы с использованием целого числа и строки код можетработа.

...