未从 asp 经典存储过程中捕获 return 值
Not capturing return value from stored proc in asp classic
抱歉这么长 post 但我想包括所有细节。
我有一个使用 ajax 的 JavaScript 函数调用一些 asp 代码,这些代码又调用一个存储过程来简单地检查记录是否已经存在。如果确实存在,则显示一张图像,如果不存在,则显示另一张图像。出于某种原因,我无法在我的 asp 变量中捕获结果,它 return 是空的,这使得调用总是 return 为假。我已经单独测试了 SQL 程序,它可以正常工作,所以数据就在那里。这是将更好地解释的代码。
存储过程:
ALTER PROCEDURE [dbo].[UserName_Get]
-- Add the parameters for the stored procedure here
@UserName nvarchar(50)
,@FacilityID INT
,@UserNameExists INT OUT
AS
BEGIN
SELECT @UserNameExists= ISNULL((SELECT UserID FROM MyTable WHERE FacilityID = @FacilityID AND Username = @UserName),0)
END
经典ASP代码:
<% Response.Buffer = True %>
<!-- #include file="../../_app_init.asp" -->
<%
Dim action, p_UserName
action = SqlSanitizeStr(trim(request("action")))
'dim UserNameExists
If action = "CheckUserName" Then
' Check to see if this username already exists for this facility
' This is an Ajax routine to check if the username already exists at the current facility or not. Returns "False" if UserName does not exist.
p_UserName=SqlSanitizeStr(trim(request("UserName")))
Set objCmd = Server.CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = DB_CONN
objCmd.CommandText = "UserName_Get"
objCmd.CommandType = adCmdStoredProc
objCmd.Parameters.Append objCmd.CreateParameter("@UserName", adLongVarChar, adParamInput, 50 , p_UserName)
objCmd.Parameters.Append objCmd.CreateParameter("@FacilityID", adInteger, adParamInput, , LOGIN_FACILITY_ID)
objCmd.Parameters.Append objCmd.CreateParameter("@UserNameExists", adInteger, adParamReturnValue)
objCmd.Execute ,, adExecuteNoRecords
UserNameExists = objCmd.Parameters("@UserNameExists").Value ' Get value of output parameter
If UserNameExists>0 Then
Response.Write ("True")
Else
Response.Write ("False")
End If
End If
%>
JavaScriptAjax呼叫
<script type="text/javascript">
function CheckUserName(UserName_element) {
var UserName = UserName_element.value;
var valid_UserName_image = document.getElementById('valid_UserName_image');
var invalid_UserName_image = document.getElementById('invalid_UserName_image');
$j.ajax({
data: { action: 'CheckUserName', p_UserName: UserName },
type: 'GET',
url: 'page_logic/_check_username_ajax.asp',
success: function (result) {
//Just to see what the return value is
alert(result)
if (result == "True") {
valid_UserName_image.style.display = "none";
invalid_UserName_image.style.display = "inline";
}
else {
valid_UserName_image.style.display = "inline";
invalid_UserName_image.style.display = "none";
}
}
}
);
}
</script>
我输入 alert(result) 以查看正在return编辑的内容,它始终是空的。
如果我将存储过程更改为
SELECT @UserNameExists=0 or SELECT @UserNameExists=1
它将return一个值,但当然这是对结果进行硬编码而不是实际从数据库中获取记录。
问题是在 SQL 服务器的存储过程中混淆了 OUTPUT
和 RETURN
的使用。
为了解决问题,您的存储过程需要一个 OUTPUT
参数而不是 RETURN
值,这是不同的。
尝试将输出参数语句更改为;
objCmd.Parameters.Append objCmd.CreateParameter("@UserNameExists", adInteger, adParamOutput)
供参考 adParamReturnValue
用于 return RETURN
语句的值(如果使用)并且限于 INT
个值。
抱歉这么长 post 但我想包括所有细节。
我有一个使用 ajax 的 JavaScript 函数调用一些 asp 代码,这些代码又调用一个存储过程来简单地检查记录是否已经存在。如果确实存在,则显示一张图像,如果不存在,则显示另一张图像。出于某种原因,我无法在我的 asp 变量中捕获结果,它 return 是空的,这使得调用总是 return 为假。我已经单独测试了 SQL 程序,它可以正常工作,所以数据就在那里。这是将更好地解释的代码。
存储过程:
ALTER PROCEDURE [dbo].[UserName_Get]
-- Add the parameters for the stored procedure here
@UserName nvarchar(50)
,@FacilityID INT
,@UserNameExists INT OUT
AS
BEGIN
SELECT @UserNameExists= ISNULL((SELECT UserID FROM MyTable WHERE FacilityID = @FacilityID AND Username = @UserName),0)
END
经典ASP代码:
<% Response.Buffer = True %>
<!-- #include file="../../_app_init.asp" -->
<%
Dim action, p_UserName
action = SqlSanitizeStr(trim(request("action")))
'dim UserNameExists
If action = "CheckUserName" Then
' Check to see if this username already exists for this facility
' This is an Ajax routine to check if the username already exists at the current facility or not. Returns "False" if UserName does not exist.
p_UserName=SqlSanitizeStr(trim(request("UserName")))
Set objCmd = Server.CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = DB_CONN
objCmd.CommandText = "UserName_Get"
objCmd.CommandType = adCmdStoredProc
objCmd.Parameters.Append objCmd.CreateParameter("@UserName", adLongVarChar, adParamInput, 50 , p_UserName)
objCmd.Parameters.Append objCmd.CreateParameter("@FacilityID", adInteger, adParamInput, , LOGIN_FACILITY_ID)
objCmd.Parameters.Append objCmd.CreateParameter("@UserNameExists", adInteger, adParamReturnValue)
objCmd.Execute ,, adExecuteNoRecords
UserNameExists = objCmd.Parameters("@UserNameExists").Value ' Get value of output parameter
If UserNameExists>0 Then
Response.Write ("True")
Else
Response.Write ("False")
End If
End If
%>
JavaScriptAjax呼叫
<script type="text/javascript">
function CheckUserName(UserName_element) {
var UserName = UserName_element.value;
var valid_UserName_image = document.getElementById('valid_UserName_image');
var invalid_UserName_image = document.getElementById('invalid_UserName_image');
$j.ajax({
data: { action: 'CheckUserName', p_UserName: UserName },
type: 'GET',
url: 'page_logic/_check_username_ajax.asp',
success: function (result) {
//Just to see what the return value is
alert(result)
if (result == "True") {
valid_UserName_image.style.display = "none";
invalid_UserName_image.style.display = "inline";
}
else {
valid_UserName_image.style.display = "inline";
invalid_UserName_image.style.display = "none";
}
}
}
);
}
</script>
我输入 alert(result) 以查看正在return编辑的内容,它始终是空的。
如果我将存储过程更改为
SELECT @UserNameExists=0 or SELECT @UserNameExists=1
它将return一个值,但当然这是对结果进行硬编码而不是实际从数据库中获取记录。
问题是在 SQL 服务器的存储过程中混淆了 OUTPUT
和 RETURN
的使用。
为了解决问题,您的存储过程需要一个 OUTPUT
参数而不是 RETURN
值,这是不同的。
尝试将输出参数语句更改为;
objCmd.Parameters.Append objCmd.CreateParameter("@UserNameExists", adInteger, adParamOutput)
供参考 adParamReturnValue
用于 return RETURN
语句的值(如果使用)并且限于 INT
个值。