【问题标题】:My Insert Stored Procedure works, but I get this error ADODB.Recordset error '800a0e78'我的插入存储过程有效,但我收到此错误 ADODB.Recordset error '800a0e78'
【发布时间】:2012-07-13 20:59:17
【问题描述】:

这个网站在帮助解决许多未知问题方面非常有用。谢谢你。现在我有一个未知数,我无法找到答案。

错误是:

ADODB.Recordset 错误 '800a0e78'

对象关闭时不允许操作。

我正在使用:

  • ASP 经典
  • MS SQL Server 2000

在 ASP 中,“表单”中有一个<textarea> 用于插入注释,当插入注释并按下提交按钮时,存储过程将注释插入到注释表中,并添加登录用户。这正是它要做的事情。此外,在 ASP 中还有一个<table>,其中填充了注释、日期时间戳和登录用户以及其他先前的条目。这也正是它应该做的事情。

当按下提交按钮时会发生上述错误,当错误页面出现时点击浏览器的返回按钮,然后刷新页面<textarea>被清除并在@中显示注释、日期时间和登录用户987654324@

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

【问题讨论】:

    标签: asp-classic ado


    【解决方案1】:

    尝试使用 Command 对象将 SP 作为参数化查询执行。这解决了您的代码容易受到 SQL 注入攻击的更严重问题。

    事实上你的第一页也容易受到攻击,你也应该在那里使用命令对象。

    您的问题的真正根源可能是resultQuery 尝试从 SP 生成记录集并对其执行某些操作,该记录集不返回结果集,它只是一个插入。在这种情况下,也许resultQuery 不适合打电话。只需要一个 ADODB Command 对象和Execute。

    【讨论】:

    • 安东尼——感谢您的帮助。我还不够了解 ADODB Command 对象和 Execute 的外观,但想让您知道我已经阅读了您的回复并正在尝试一下。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2011-12-12
    • 2023-02-24
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多