Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 通过ASP(经典VBSCRIPT)从SQL存储过程检索输出变量时出现问题_Sql Server 2005_Vbscript_Asp Classic - Fatal编程技术网

Sql server 2005 通过ASP(经典VBSCRIPT)从SQL存储过程检索输出变量时出现问题

Sql server 2005 通过ASP(经典VBSCRIPT)从SQL存储过程检索输出变量时出现问题,sql-server-2005,vbscript,asp-classic,Sql Server 2005,Vbscript,Asp Classic,我是新来的,这是我的第一篇文章。我在SQLServer中创建了一个具有(4)个输入参数和(1)个输出参数的存储过程。存储过程用于在表中插入或删除记录。为输出参数分配了一条消息,该消息将返回到ASP页,以提供有关存储过程中发生的情况的反馈。即“记录已插入”、“记录已存在”或“记录已删除” 当我从网页上运行代码时,记录会按原样添加和删除。唯一的问题似乎是让输出参数返回一个值 当我从SQLServerManagementStudio执行存储过程时,将显示输出参数 我搜索了互联网,并对照其他示例检查了我

我是新来的,这是我的第一篇文章。我在SQLServer中创建了一个具有(4)个输入参数和(1)个输出参数的存储过程。存储过程用于在表中插入或删除记录。为输出参数分配了一条消息,该消息将返回到ASP页,以提供有关存储过程中发生的情况的反馈。即“记录已插入”、“记录已存在”或“记录已删除”

当我从网页上运行代码时,记录会按原样添加和删除。唯一的问题似乎是让输出参数返回一个值

当我从SQLServerManagementStudio执行存储过程时,将显示输出参数

我搜索了互联网,并对照其他示例检查了我的代码。我不知道为什么我不能得到返回的值。任何帮助都将不胜感激

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")
Dim addContacts\uuuu ContactID
addContacts\uuu ContactID=“0”
如果是(请求(“ContactID”)),则添加Contacts\uuuContactId=请求(“ContactID”)
Dim addContacts\uuuu FacNum
addContacts\uuu FacNum=LEFT(Request.Form(“FacilityNumber”),4)
如果为(请求(“FacNum”),则添加联系人\uuu FacNum=Request(“FacNum”)
Dim ADD联系人\uuuu员工ID
addContacts\uuu EmployeeID=Request.Form(“EmployeeID”)
如果是(请求(“EmployeeID”)),则添加Contacts_uuemployeeId=请求(“EmployeeID”)
Dim添加联系人\uuuu删除
addContacts\uu Delete=“N”
如果为(请求(“删除”),则添加联系人\删除=请求(“删除”)
暗信
设置addContacts=Server.CreateObject(“ADODB.Command”)
addContacts.ActiveConnection=MY\u字符串
addContacts.CommandText=“我的存储过程”
addContacts.CommandType=4'作为存储过程计算
addContacts.CommandTimeout=0
addContacts.Prepared=true
addContacts.Parameters.Append addContacts.CreateParameter(“@RETURN\u VALUE”,3,4)
addContacts.Parameters.Append addContacts.CreateParameter(“@ContactID”,3,1,10,addContacts\uuuu ContactID)
addContacts.Parameters.Append addContacts.CreateParameter(“@FacNum”,129,1,4,addContacts\uuu FacNum)
addContacts.Parameters.Append addContacts.CreateParameter(“@EmployeeID”,129,1,8,addContacts\uuuu EmployeeID)
addContacts.Parameters.Append addContacts.CreateParameter(“@Delete”,129,1,1,addContacts\uu Delete)
addContacts.Parameters.Append addContacts.CreateParameter(“@OutputMessage”,2002200)
strReturnMessage=addContacts.Parameters(“@OutputMessage”)

试试这样的方法

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

++示例仅根据需要使用modify++

您使用的变量与整数和字符串相同。 存储过程定义了一个输出参数-@OutputMessage。此变量由存储过程修改并返回。您应该捕获的就是这个变量。 存储过程中的代码很混乱。您希望@OutputMessage是字符串还是整数? 例如,请参见SP中的以下相邻行:

SELECT @OutputMessage = 2

PRINT @OutputMessage  

SET @OutputMessage =  'This Person is already a contact.'
第一行将@OutputMessage视为一个整数(当SET语句足够时,使用SELECT语句有什么用?) 然后你打印,没有抱怨。 然后将其设置为文本值(至少这次使用set语句)

回顾SP的定义,它将参数定义为: @输出消息为NVARCHAR(200)=“测试”输出 它不是一个整数

当您尝试使用cint转换结果时,VB脚本似乎期望得到一个整数,而SP中变量的默认值是“test”

“带响应”区域中的代码也很混乱,应该重新编写


通过使用整数和字符串来消除混淆,代码可以正常工作。

谢谢大家。我将尝试将我的代码封装在一个函数中,看看它是否有效。这很奇怪。我已经让其他程序员看过了,他们说代码看起来不错,应该可以工作。我想知道它是否可能是服务器上IIS中的一个设置。哦,好吧,我先试试你的建议,看看效果如何。RussI确实发现了这一点:(但我不确定这是否是我的问题)直到过程生成的所有结果集都发送到客户机后,才会发送输出和返回参数值。这意味着你必须:1。使用仅向前游标时,请在尝试读取输出和返回参数2之前关闭记录集。使用客户端游标时,打开记录集时会发送整个静态结果集,因此会立即发送输出和返回参数。
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