2015-01-20 6 views
1

Извините за длинный пост, но я хотел включить в него все данные.Не записывать возвращаемое значение из хранимой процедуры в asp classic

У меня есть функция JavaScript с использованием ajax, которая вызывает некоторый код asp, который, в свою очередь, вызывает хранимую процедуру, чтобы просто проверить, существует ли запись. Если он существует, появляется одно изображение, если оно не существует, появляется другое изображение. По какой-то причине я не могу зафиксировать результаты в моей переменной asp, она возвращает пустую, что делает вызов всегда возвращает false. Я сам протестировал 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 



%> 

JavaScript Ajax вызовов

<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> 

I вставить предупреждение (результат), чтобы увидеть, что было возвращено, оно всегда пустое.

Если изменить хранимая процедура просто

SELECT @UserNameExists=0 or SELECT @UserNameExists=1 

Она возвращает значение, но, конечно, это жесткое кодирование результата и на самом деле не получить записи из БД.

+0

'SqlSanitizeStr', откуда эта функция? – Mouser

+0

Это функция, написанная до того, как я попал на борт проекта, она в основном разделяет наши одиночные апострофы и другие символы, которые SQL не нравится. Это не так эффективно, но он используется во всем этом проекте, поэтому я должен жить с ним. Мы медленно конвертируем его в .Net, но пока нам приходится иметь дело с классическим asp, потому что это то, что происходит в производстве и используется многими людьми. – Michael

+0

Вот почему вы видите $ j., Вместо просто $. Человек, который начал это, начал строить свои собственные рамки в классическом asp. С трудом работать сложно. – Michael

ответ

0

Проблема заключается в смешивании между использованием OUTPUT и RETURN в хранимых процедурах на SQL Server.

Чтобы устранить проблему, ваша хранимая процедура ожидает параметр OUTPUT вместо значения RETURN, которое является чем-то другим.

Попробуйте изменить свой параметр выходных параметров на;

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

Для справки adParamReturnValue используются для возвращения значения RETURN заявления, если они используются и ограничиваются INT значений.

+0

Этот ответ, возможно, помог, как ни странно, проблема, которая его решила навсегда, была в моей хранимой процедуре. Я устанавливал возвращаемую переменную, используя «Select @variable», я изменил ее на «Set @variable», и страница asp подняла ее. Trial и Error ..... – Michael

+0

@Michael Помните, что возвращаемое значение является чем-то другим, чтобы избежать путаницы, вызывать их выходные параметры. Вы использовали 'adParamOutput' в конце ?, интересный момент о' SELECT' по сравнению с 'SET', не могу сказать, что я столкнулся с этим раньше. – Lankymart

+0

Да, в итоге я использовал adParamOutput. – Michael

Смежные вопросы