从ASP.NET更新查询到.MDB失败

时间:2015-11-12 18:30:37

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

上下文:

我有一个持续失败的Microsoft Access数据库的更新查询。查询在从我的数据库中执行时有效,但在从我的.aspx页面的CodeFile执行时失败。

我确保:

  • 我的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(Object& executeResult)+189    System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior,Object& executeResult)+58    System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior,String method)+162    System.Data.OleDb.OleDbCommand.ExecuteNonQuery()+ 107    C:\ Dustin \ FAQDB.aspx.vb中的jsDB.Page_Load(Object sender,EventArgs e):29    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,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

3 个答案:

答案 0 :(得分:0)

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

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

看起来你要么没有以正确的模式打开连接(在这种情况下是模式3),要么是"表"您正在更新具有阻止您更新它的条件。我敢打赌,将模式更改为3可以解决问题。

答案 1 :(得分:0)

这里有一些错误可能会帮助您解决此问题以及将来的其他问题。

  1. IsNumeric(cint(cleanID)) - CInt()上的IsNumeric()无关紧要。 CInt将返回System.Int32或错误。你应该只做IsNumeric(),如果你想知道它是否是Int32,那么就在它上面做一个Int32.TryParse()。
  2. 您的命令应该参数化以避免注入并避免传递错误的数据类型。例如,我不知道questionID是否是一个字符串(这会使你的语法错误)或者它是否是一个int32。但是,参数化命令会为SQL提供正确的语法。你可以在ho上找到成千上万的例子,所以我不会在这里再解释一下。
  3. 最后一项,可能是解决方案,MS Access查询以分号(;)结尾。好像我以前遇到过问题而没有在MS Access的UPDATE命令中使用它们。
  4. 作为旁注。 MS Access处理多个连接非常糟糕,因为错误导致它们处于打开状态会导致巨大的问题。确保所有数据库调用都有正确的错误处理,如果你可以将它们放在USING块中,那就更好了。

答案 2 :(得分:0)

向@Steve致敬,感谢他们为此提供了如此大的帮助。

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

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

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

感谢大家的投入!