【问题标题】:Update Query from ASP.NET to .MDB Failing将查询从 ASP.NET 更新到 .MDB 失败
【发布时间】:2016-02-14 04:57:04
【问题描述】:

上下文:

我有一个不断失败的 Microsoft Access 数据库的更新查询。该查询在我的数据库中执行时有效,但在我的 .aspx 页面的代码文件中执行时失败。

我已确保:

  • 我的 App_Data 文件夹具有写入权限(通过 IUSR)
  • 我的数据库不是“只读”
  • 我的查询语法正确

有人对我可能遗漏的内容有任何建议吗? 谢谢!!

代码:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.UI.WebControls
Imports System.Data.OleDb

Partial Class jsDB

Inherits System.Web.UI.Page

Private con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = C:\Dustin\App_Data\FAQ.accdb")

Public Sub Page_Load(sender as object, e as System.EventArgs)

    If request.QueryString("type") = "helpful" Then

        Dim cleanID as string
        cleanID = request.querystring("id")

        If IsNumeric(cint(cleanID)) Then 'Make sure QueryString hasn't been tampered with

            Dim sql as string
            sql = "UPDATE QUESTION SET helpful=helpful+1 WHERE questionID=" & cleanID

            Dim cmd As New OleDbCommand(sql, con)

            con.Open()
            cmd.ExecuteNonQuery()
            con.Close()

            Response.write("Success")

        else

            Response.write("Invalid ID")

        end if

    else

        Response.write("No recognized type")

    end If

End Sub
End Class

错误:

“/”应用程序中的服务器错误。

操作必须使用可更新的查询。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.OleDb.OleDbException:操作必须使用可更新查询。

来源错误:
第 27 行:
第 28 行:con.Open()
第 29 行:cmd.ExecuteNonQuery()
第 30 行:con.Close()
第 31 行:
源文件:C:\Dustin\FAQDB.aspx.vb 行:29

堆栈跟踪:
[OleDbException (0x80004005):操作必须使用可更新的查询。] System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +1102900 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +247 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象和执行结果)+189 System.Data.OleDb.OleDbCommand.ExecuteCommand(命令行为行为,对象和执行结果)+58 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)+162 System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +107 C:\Dustin\FAQDB.aspx.vb:29 中的 jsDB.Page_Load(Object sender, EventArgs e) System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象发送者,EventArgs e)+51 System.Web.UI.Control.OnLoad(EventArgs e) +92 System.Web.UI.Control.LoadRecursive() +54 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

【问题讨论】:

标签: sql asp.net vb.net ms-access


【解决方案1】:

感谢@Steve 在这方面提供了如此大的帮助。

我在这里遇到了几个问题。虽然我确信有很多问题可能会导致我遇到的错误,但以下是为我解决的问题:

  • 在 IIS 中创建了一个新的应用程序池,并将这个新池写入我的 App_Data 文件夹的权限
  • 将此新应用程序池分配给我的应用程序
  • 在高级设置下修改了新的应用程序池以允许 32 位应用程序

截至目前,“Microsoft.ACE.OLEDB.12.0”提供程序仅适用于 32 位。更改我的应用程序池以允许 32 位应用程序解决了该问题。

感谢大家的意见!

【讨论】:

    【解决方案2】:

    这里做错了几件事,可能会帮助您在未来解决这个问题和其他问题。

    1. IsNumeric(cint(cleanID)) - CInt() 上的 IsNumeric() 无关紧要。 CInt 将返回 System.Int32 或错误。您应该只执行 IsNumeric(),如果您想知道它是否是 Int32,则对其执行 Int32.TryParse()。
    2. 您的命令应该被参数化以避免注入和传递错误的数据类型。例如,我不知道 questionID 是字符串(这会使您的语法错误)还是 int32。但是,参数化命令将为您的 SQL 提供正确的语法。你可以在 ho 上找到数千个例子来做到这一点,所以我在这里不再解释。
    3. 最后一项,可能是解决方案,MS Access 查询喜欢以分号 (;) 结尾。似乎我过去曾遇到过问题,因为我的 MS Access 的 UPDATE 命令中没有它们。

    作为旁注。 MS Access 在处理多个连接方面很糟糕,因此由于错误而使它们保持打开状态会给您带来巨大的问题。确保所有数据库调用都有适当的错误处理,如果你可以将它们放在 USING 块中,那就更好了。

    【讨论】:

    • 我已完成您推荐的所有更改(感谢您提供的惊人反馈),但我仍然收到错误消息。我的 catch 语句报告了以下异常消息:“'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。”这是否意味着我需要让我们的技术团队将驱动程序加载到我们的网络服务器?顺便说一句,非常感谢您迄今为止的帮助!
    • 您在网络服务器上的错误是另一个问题。我不会在这里回答,但我会给你一个提示(因为我也已经知道这个了); ACE 驱动程序没有像以往那样随操作系统一起安装在 x64 服务器上。
    • 是的,在发布新异常后,我设法弄清楚了这一点。将用答案更新我的帖子。感谢您的帮助!
    【解决方案3】:

    此帮助页面解决了您收到的错误:

    https://support.microsoft.com/en-us/kb/175168

    看起来您没有以正确的模式(在本例中为模式 3)打开连接,或者您正在更新的“表”存在阻止您更新它的条件。我敢打赌,将您的模式更改为 3 会解决问题。

    【讨论】:

    • 除非我有误解,否则 OLEDB 连接没有 Mode 属性。如果我弄错了,请原谅我!我没有看到 OleDbConnection 类的等效项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2019-06-04
    相关资源
    最近更新 更多