Я разрабатываю / поддерживаю классические страницы asp и код asp на ПК под управлением Windows 7 с данными, полученными с Sqlserver / Express 2008 / R2 .
Inэтот код я использую хранимую процедуру для входа на веб-сайт.
Если комбинация идентификатора входа и пароля верна, некоторые таблицы обновляются с помощью UPDATE или INSERT.
Если идентификатор входа или парольневерно, запись в журнал не производится (поэтому таблицы не обновляются).
Набор результатов возвращается с некоторыми полями в обоих случаях (с набором полей-1 или номер внутреннего пользователя в зависимости от правильности идентификатора входа и пароля).
Я использую эту же процедуру уже более 5 лет, работая на всех типах серверов IIS исо всеми видами Sqlservers.
Код, который работает на других комбинациях IIS / Sqlservers, не работает на моем компьютере для разработки.
Есть идеи почему?
Поскольку это среда разработки, я использую учетную запись sqlserver SA с соответствующим паролем.Итак, насколько я могу судить, у этого пользователя SA должны быть все соответствующие права.
Для завершения я сейчас дам подпрограмму (но вы увидите, что она очень прямолинейна):
function DoLogon( byval psNickName, byval psPassword)
dim sSql
DoLogon = False
psNickName = Trim(psNickName)
psPassword = Trim(psPassword)
if (psNickName = "") then exit function
if (psPassword = "") then exit function
' on error Resume Next
call DbOpen
sSql = "exec sp_EcomLogon " & SqlString( psNickName ) & "," & _
SqlString(psPassWord) & "," & _
SqlString(Request.ServerVariables("REMOTE_ADDR")) & "," & _
Trim(cStr(Session.SessionId))
objRec.Open sSql ,objConn ' ,adOpenStatic,adLockReadOnly ,adCmdText
Klant_NetId = FldDft("K_NetId",-1)
Call SetVarValue(cKlant_NetId,Klant_NetId)
objRec.Close
call DbClose
if Klant_NetId <> -1 then
DoLogon = True
Klant_IsLoggedOn = 1
else
DoLogon = False
Klant_IsLoggedOn = 0
end if
call SetVarValue(cKlant_IsLoggedOn, Klant_IsLoggedOn)
end function
При наличии строки objRec.Close
отображается следующая ошибка:
ADODB.Recordset error '800a0e78'
Operation is not allowed when the object is closed.
Замена exec sp_...
на select * from ...
работает.Поэтому я предполагаю, что сам код является правильным.
DbOpen и DbClose выделят objRec
и objConn
и подключатся к серверу / отсоединятся от него (здесь SqlServer).
ОБНОВЛЕНИЕ И РЕШЕНИЕ
Я попросил человека, предоставляющего мне это решение, создать ответ, чтобы я мог дать ему правильные голоса, но в целомраз я представлю решение здесь.
В качестве первого утверждения, если хранимая процедура, которую я добавил,
установить nocount на
И, похоже, это хитрость, чтобы получить егоработает.
Я не нашел, почему это необходимо (с технической точки зрения), только то, что включение set nocount on
ускорит хранимые процедуры, но наконец я запустил хранимые процедуры в сочетании с классическим ASPеще раз!