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