0

このサイトは、多くの不明な点を解決するのに非常に役立ちました。ありがとうございました。今、私は答えを見つけることができなかった未知のものを1つ持っています。

エラーは次のとおりです。

ADODB.Recordset エラー '800a0e78'

オブジェクトが閉じているときは操作できません。

私は使用しています:

  • ASPクラシック
  • Microsoft SQL Server 2000

ASP<textarea>では、メモを挿入する「フォーム」内にメモが挿入され、送信ボタンが押されると、ストアド プロシージャがメモをメモ テーブルに挿入し、日時をスタンプし、ログオン ユーザーを追加します。それはまさにやるべきことをやっている。さらに、ASP には<table>、メモ、日付タイムスタンプ、およびログオン ユーザーを他の以前のエントリと共に入力する があります。それもまさにやるべきことをやっている。

上記のエラーは、[送信] ボタンが押されたときに発生し、エラー ページが表示されたときにブラウザーの [戻る] ボタンを押してからページを更新すると、ページ<textarea>がクリアされ、メモ、日時、およびログオン ユーザーが表示されます。<table>

ASP クラシック ページ:

Dim rsAccountNote

<form name="Accountnote" method="post" action="/admin/xt_Accountnote.asp">


    <td>
    <b>Add Note:</b><br />
    <textarea type="text" name="notes" value="" rows="7" cols="43" style="resize: none;"></textarea><br />
    <input type="submit" value="Add new note"/>
</td>

<table>

<tr>    

    <td>
    <b>Read Notes:</b>
    </td>

</tr>

        <%

        set rsAccountNote = DBConn.Execute("SELECT AccountNotes, LogonUser_Id, dtAccountNotedatetime FROM AccountNotes WHERE AccountId = " & rsAccount("AccountId"))

        rsAccountNote.Sort="dtAccountNotedatetime DESC" 

        Do While Not rsAccountNote.EOF

        %>          

<tr>

    <td>
    Added &nbsp;<%=rsAccountNote("dtAccountNotedatetime")%> &nbsp;by &nbsp;<%=rsAccountNote("LogonUser_Id")%>
    </td>

</tr>

<tr>

    <td>
    <b>Note:&nbsp;</b> <%=rsAccountNote("AccountNotes")%>
    </td>

    </tr>

        <%

        rsAccountNote.MoveNext  

        Loop    

        Set rsAccountNote = Nothing

        %>

</tr>

    </td>
</tr>
</table>
</form>

ASP クラシック xt_page:

<%

Dim rsAccount
Dim iAccount
Dim LogonUser_id
Dim AccountNotes

sSQL = "exec spApp_UpdateAccountNotes " & _
    "@iAccount = " & Trim(Request("Account_id")) & ", " & _
    "@AccountNotes = " & prepString(Request("AccountNotes")) & ", " & _
    "@LogonUser_id = " & prepString(Request("Logon_User"))
Call resultQuery(DBConn, rsAccount, sSQL, "", true)

    Response.Redirect("/Account_admin/accountinfo.asp?account_id=" & Trim(Request("account_id")))

%>

ストアド プロシージャ:

CREATE PROCEDURE spApp_UpdateAccountNotes
    (
    @iAccount int,
    @LogonUser_id varchar (50),
    @AccountNotes varchar(5000)
    )
AS

    SET NOCOUNT ON

    insert AccountNotes
        (
        AccountId,
        LogonUser_Id,
        AccountNotes
        )
    values
        (
        @iAccount,
        @LogonUser_Id,
        @AccountNotes
        )
GO

4

1 に答える 1

1

Command オブジェクトを使用して、SP をパラメーター化されたクエリとして実行してみてください。これにより、コードが SQL インジェクション攻撃にさらされるというより深刻な問題が解決されます。

実際、最初のページも攻撃に対してオープンです。そこでもコマンド オブジェクトを使用する必要があります。

おそらく、問題の本当の原因はresultQuery、結果セットを返さない SP のレコードセットを生成して何かを実行しようとすることです。これは挿入のみです。おそらくresultQuery、この場合は呼び出すべきものではありません。ADODB Command オブジェクトであり、Execute必要なものはこれだけです。

于 2012-07-14T20:37:59.177 に答える