Извините за длинный пост, но я хотел включить в него все данные.Не записывать возвращаемое значение из хранимой процедуры в 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
Она возвращает значение, но, конечно, это жесткое кодирование результата и на самом деле не получить записи из БД.
'SqlSanitizeStr', откуда эта функция? – Mouser
Это функция, написанная до того, как я попал на борт проекта, она в основном разделяет наши одиночные апострофы и другие символы, которые SQL не нравится. Это не так эффективно, но он используется во всем этом проекте, поэтому я должен жить с ним. Мы медленно конвертируем его в .Net, но пока нам приходится иметь дело с классическим asp, потому что это то, что происходит в производстве и используется многими людьми. – Michael
Вот почему вы видите $ j., Вместо просто $. Человек, который начал это, начал строить свои собственные рамки в классическом asp. С трудом работать сложно. – Michael