2011-11-24 93 views
1

我正在開發/維護傳統的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和DbClos​​e將分配objRecobjConn並連接到從服務器(這裏SqlServer的)/斷開。

更新和解決方案

我也問過我提供這個解決方案的人創造一個答案,所以我可以給他適當的upvotes,但在此期間,我將在這裏提出的解決方案。

隨着第一條語句如果

存儲過程我已經加入

SET NOCOUNT這似乎是招得到它的工作。

我還沒有找到爲什麼這是必要的(從技術角度來看),只是包括set nocount on將加快存儲過程,但最後我再次運行存儲過程與經典ASP組合!

+0

究竟什麼不行?你有例外嗎?一個可能的解釋可能是,Win7運行IIS7,它在「集成模式」,不完全兼容IIS6 – Andomar

+0

@Andomar:我這樣說:對'objRec.Close'的調用給出一個'操作是不允許的,當對象是closed.'消息,表示'objRec.Open ...'調用沒有成功。 – Edelcom

+0

嘗試在存儲過程的頂部添加'set nocount on'? – Andomar

回答

3

嘗試將set nocount on添加到存儲過程的頂部?

0

我遇到了類似的問題,在我的情況下,問題是我選擇的表上的權限。我沒有選擇權限,它會關閉連接。現在您提到您使用的是sa帳戶,因此它應該具有所有功能的權限,但我會仔細檢查以確保這是真實的。 HTH

韋德

+0

在此處提問之前,請雙擊此選項。在數據庫客戶端程序中執行'exec sp _...',起作用。 – Edelcom

+0

@edelcom這個錯誤很糟糕,因爲它從來沒有向你顯示正確的錯誤。我可以假設你也查看了SQL Server日誌以查看是否有任何錯誤? – Wade73

2

這可能是因爲您訪問該存儲過程與錯誤執行。我建議你寫出字符串sSql來屏幕複製並在查詢分析器中執行以排除故障。

+0

SQL是正確的,我總是調試(Response.Write)我的查詢,以防萬一。在數據庫程序(我使用數據庫工作臺)中執行確切的查詢是有效的。我必須與權限有關,但由於我已經在使用sa帳戶,所以我沒有看到問題出在哪裏。 – Edelcom

+1

嘗試使用Profiler如Anj Profiler http://anjlab.com/en/projects/opensource/sqlprofiler來分析數據庫調用,以查看哪個帳戶正在執行存儲過程等。 –

+0

+1提到profiler。這至少驗證是否符合使用正確的帳戶來運行storec過程並且存儲過程的語法是正確的。進一步調查後,我發現在幾個程序的頂部放置'set nocount'是必需的。不知道爲什麼,但解決了這個問題。我曾問過@Andomar(誰提供這個解決方案作爲評論),以便將他的評論作爲答案。 – Edelcom