未从 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 服务器的存储过程中混淆了 OUTPUTRETURN 的使用。

为了解决问题,您的存储过程需要一个 OUTPUT 参数而不是 RETURN 值,这是不同的。

尝试将输出参数语句更改为;

objCmd.Parameters.Append objCmd.CreateParameter("@UserNameExists", adInteger, adParamOutput)

供参考 adParamReturnValue 用于 return RETURN 语句的值(如果使用)并且限于 INT 个值。