2012-02-17 15 views
0

私の古典的なASPページは、私の ストアドプロシージャのExecコードに2つのパラメータを渡すとエラーになります。基本的には、私は を探している列をカバーするために1つのパラメータを送信し、検索語には1つを送信したいと考えています。例えば、ニューヨーク大学のimSchool。私は2つのparamertsとSQLクエリを選択するたびに、 "オブジェクトが閉じられたときに操作は許可されていません"ということを示すRecord Set.Stateコードと同様に、送信されたデータのデータチェックを行います。常に表示されます。 "While Not rs.EOF"というコード行でオブジェクトをオープンしようとしましたが、エラーが発生しました。 同じ入力でMSSQLでストアドプロシージャを実行すると、毎回リターンテーブルが取得されるため、私のSQLQueryが悪いと思っています。 SQL Server 2008 R2および従来のASP。ADODB.Recordsetエラー '800a0e78' - 2つのパラメータ(ASP/MSSQL)を渡したときのエラー

HEREここに私のIFなステートメントWITHのSQLQuery CODE(第一1が正常に動作し、データをDBから選択された心に留めておく)

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

これはもう一度感謝を働きました。前の回答も同様ですが、私はレコードセットをページの最後に閉じます。したがって、それは2番目のIFステートメントに到達する前に閉じたままです。 – user1188287

+0

推奨事例コードでは、ADODB.Commandオブジェクトを調べて、生のテキストとして渡す代わりにパラメータを作成します。あなたが持っているものは問題ありませんが、SQLインジェクションには脆弱ではありませんが、ベストプラクティスではありません。 –

0

ISの同時に同じオブジェクトを2回使用することはできません(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 
関連する問題