2012-02-17 30 views
0

當我將2個參數傳遞給我的 存儲過程的Exec代碼時,我的傳統ASP頁面出現錯誤。基本上我想發送1 paremeter來涵蓋我正在尋找 的列和一個搜索字詞。例如紐約大學的imSchool。我對發送的數據進行了數據檢查,並記錄了Set.State代碼,顯示每次我選擇帶有兩個參數的SQL Query時,出現錯誤「對象關閉時不允許操作」。總是顯示。 我試圖在「While not rs.EOF」代碼行打開對象,在這裏它錯誤地沒有運氣。 我在想我的SQLQuery不好,因爲當我用相同的輸入在MSSQL中運行存儲過程時,我每次都得到一個返回表。 SQL Server 2008 R2和經典ASP。ADODB.Recordset錯誤'800a0e78' - 當我傳遞2個參數時出錯(ASP/MSSQL)

這裏是我的IF STATMENT WITH sqlquery的代碼(記住第一個1工作正常,數據從數據庫中選擇)

SQLQuery = "Exec sp_vw_InternImport" 

    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.CursorType = 3 

    rs.Open SQLQuery, OBJdbConnection 


    If filterColmn <> "" Then 

    SQlQuery = "Exec sp_vw_InternImport_ColID @LookUpID=N'" + filterID + "'" + ", @LookUpCol=N'" + filterID + "'" 

    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.CursorType = 3 

    rs.Open SQLQuery, OBJdbConnection 

    End If 

這裏是我的存儲過程代碼

  SET ANSI_NULLS ON 
      GO 
      SET QUOTED_IDENTIFIER ON 
      GO 

      ALTER PROCEDURE [dbo].[sp_vw_InternImport_ColID] 
      (
      @LookUpID nvarchar (255), 
      @LookUpCol nvarchar (50) 
      ) 

      AS 
     SET NOCOUNT ON 
     BEGIN 

     IF @LookUpCol = 'imYear' 
     SELECT * FROM v_InternImport WHERE imYear = @LookUpID 

ELSE 
IF @LookUpCol = 'imSchool' 
SELECT * FROM v_InternImport WHERE imSchool = @LookUpID 

ELSE 
IF @LookUpCol = 'imDiscipline' 
SELECT * FROM v_InternImport WHERE imDiscipline = @LookUpID 

     IF @LookUpCol = 'imDegree' 
     SELECT * FROM v_InternImport WHERE imDegree = @LookUpID 
     END 

回答

0

當直接傳遞參數給存儲過程,你不必爲 「分配」 的參數。這樣做可能會導致整個值通過(例如@LookUpCol將具有值@LookUpCol ='imYear'),因此您的SP不會選擇任何內容,並且您有空的和關閉的記錄集。

嘗試有這樣的代碼來代替:

SQlQuery = "Exec sp_vw_InternImport_ColID '" & filterID & "', '" & filterID & "'" 
+0

這再次感謝工作。前面的答案也是一個問題,但我關閉了頁面底部的記錄集,因此它在到達第二個IF語句之前保持關閉狀態。 – user1188287 2012-02-20 15:31:53

+0

乾杯,讓最佳實踐代碼查看ADODB.Command對象並使用它,創建參數而不是將它們作爲原始文本傳遞 - 您擁有的是好的,不應該容易受到SQL注入的影響,但仍不是最佳實踐。 – 2012-02-21 07:53:56

0

你不能同時使用兩次相同的對象(如rs),您必須將其改爲另一個名稱,或者必須關閉它並重新開始。這應該起作用:

SQLQuery = "Exec sp_vw_InternImport" 
If filterColmn <> "" Then SQLQuery = "Exec sp_vw_InternImport_ColID @LookUpID=N'" + filterID + "'" + ", @LookUpCol=N'" + filterID + "'" 

    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.CursorType = 3 
    rs.Open SQLQuery, OBJdbConnection 
    rs.Close 

或者在您的示例中,如果在繼續下一步之前關閉第一個rs對象,則可能有所幫助。

set rs = nothing ... then .... set rs = server.createobject

所以這樣的:

SQLQuery = "Exec sp_vw_InternImport" 

Set rs = Server.CreateObject("ADODB.Recordset") 
rs.CursorType = 3 
rs.Open SQLQuery, OBJdbConnection 

rs.Close ------ Close it before you re-open it 

If filterColmn <> "" Then 

SQlQuery = "Exec sp_vw_InternImport_ColID @LookUpID=N'" + filterID + "'" + ", @LookUpCol=N'" + filterID + "'" 

rs.Open SQLQuery, OBJdbConnection 
rs.Close ------ Always Close your Objects! 

End If 
相關問題