Вызов хранимой процедуры завершается неудачно в классическом asp, когда хранятся таблицы процедур INSERT или UPDATE. - PullRequest
1 голос
/ 24 ноября 2011

Я разрабатываю / поддерживаю классические страницы 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еще раз!

Ответы [ 3 ]

3 голосов
/ 26 ноября 2011

Попробуйте добавить set nocount on в начало хранимой процедуры?

2 голосов
/ 25 ноября 2011

Возможно, хранимая процедура, к которой вы обращаетесь, выполняется с ошибкой.Я бы посоветовал вам написать строку sSql, чтобы скопировать ее на экран, и выполнить ее в анализаторе запросов, чтобы устранить ее.

0 голосов
/ 25 ноября 2011

Я столкнулся с подобной проблемой, и в моем случае проблема заключалась в разрешениях для таблицы, из которой я выбирал. У меня не было разрешений на выбор, и он закрывал бы соединение. Теперь вы упомянули, что используете учетную запись sa, так что у нее должны быть разрешения на все функции, но я бы дважды проверил, чтобы убедиться, что это правда. НТН

Wade

...