我正在開發/維護傳統的ASP頁面和ASP代碼從sqlserver的/快遞2008/R2取數據在Windows 7 PC上。調用存儲過程在傳統的ASP失敗時,存儲過程的INSERT或UPDATE表
在此代碼中,我使用存儲過程登錄到網站。
如果登錄ID和密碼組合正確,則使用UPDATE或INSERT更新某些表。
如果登錄ID或密碼不正確,則不會發出日誌記錄(因此沒有更新表)。
的結果集被返回與這兩種情況下的某些字段(具有字段設置爲-1或取決於登錄ID和密碼的正確性內部用戶NR)。
我已經使用這個相同的例程超過5年了,運行在各種IIS服務器和各種Sqlservers上。
該工作在其他IIS/Sqlservers組合上的代碼在我的開發PC上不起作用。
任何想法爲什麼?
由於它是一個開發環境,我使用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.
用
select * from ...
替代exec sp_...
的作品。所以我認爲它自己的代碼是正確的。DbOpen和DbClose將分配
objRec
和objConn
並連接到從服務器(這裏SqlServer的)/斷開。
更新和解決方案
我也問過我提供這個解決方案的人創造一個答案,所以我可以給他適當的upvotes,但在此期間,我將在這裏提出的解決方案。
隨着第一條語句如果
存儲過程我已經加入
SET NOCOUNT這似乎是招得到它的工作。
我還沒有找到爲什麼這是必要的(從技術角度來看),只是包括set nocount on
將加快存儲過程,但最後我再次運行存儲過程與經典ASP組合!
究竟什麼不行?你有例外嗎?一個可能的解釋可能是,Win7運行IIS7,它在「集成模式」,不完全兼容IIS6 – Andomar
@Andomar:我這樣說:對'objRec.Close'的調用給出一個'操作是不允許的,當對象是closed.'消息,表示'objRec.Open ...'調用沒有成功。 – Edelcom
嘗試在存儲過程的頂部添加'set nocount on'? – Andomar