zoukankan      html  css  js  c++  java
  • Access中"''80004005''"操作必须使用一个可更新的查询"错误的解决办法

    今天又遇到这样一个错误“操作必须使用一个可更新的查询”这里我整理下原因及解决办法,大家以后再遇到相同的问题可以先试下类似的解决办法.

    错误信息: 

    Microsoft OLE DB Provider for ODBC Drivers error ''80004005'' 
    [Microsoft][ODBC Microsoft Access 97 Driver] Operation must use an 
    updateable query. 
    或者是: 
    Microsoft JET Database Engine (0x80004005) 
    操作必须使用一个可更新的查询。 

    原因: 
    有几个主要的错误原因: 
    这个错误发生在当你的程序试图执行更新数据库或其它类似操作时。这是因为 
    ADO由于以下的几个原因而不能够写数据库造成的。 

    1。一般的原因都是匿名用户帐号(IUSR_MACHINE)对该数据库文件没有写权限。 
    要解决这个问题,在管理器中调整数据库文件的属性,让匿名用户有正确的权限。 
    当使用ACCESS数据库时,不仅要给文件写的权限,还要给该目录写的权限,因为 
    Jet需要在该目录建立一个.ldb文件[NTFS硬盘格式才会出现,FAT格式的不会出现权限问题]。
    或是在IIS中设置一个有读取写入权限的匿名帐户.

    2。第二个原因是数据库没有使用正确的模式打开。应该使用下面的方法打开。 
    SQL = "UPDATE Products Set UnitPrice = 2;" 
    Set Conn = Server.CreateObject("ADODB.Connection") 
    Conn.Mode = 3 ''3 = adModeReadWrite 
    Conn.Open "myDSN" 
    Conn.Execute(SQL) 
    Conn.Close

    注意默认的Mode是设置0(adModeUnknown),它是允许更新的。 

    3。还有可能是在ODBC管理器中将该DSN的只读选项选中。 

    4。你是在同时更新两个表中的字段,也会出现这个错误信息,解决办法是分开来更新 
    这两个表中各自字段。 

    5。当你使用了一个从低版本中(如ACCESS2.0,ACCESS7.0)载入到高版本(ACCESS 2000) 
    中的查询时,在执行这个查询是会出现该错误。 

    如果是winXP系统
    在文件夹选项里面默认使用简单共享(推荐),把这个选项去掉,
    再在文件夹上右键点击,就会出现安全这个选项卡,
    原来默认的没有,然后在安全选项卡里面可以设置用户的写入权限了
    右击数据库>安全>everyone>将需要的勾上


    遇到类似的问题还有: 
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005' 
    [Microsoft][ODBC Microsoft Access Driver] 无法从指定的数据表中删除。

    关于Access所有记录中均未找到搜索关键字的错误
    今天去看了我原来修改艺龙的网站点击灵感发现网站访问量还不低,不过速度变得好慢,查看了一下原来有很多人在留言板上发了很多垃圾广告,进后台删除广告贴,出现"所有记录中均未找到搜索关键字"错误。

    出现此错误是因为Access数据库有错误了[数据库损坏],
    使用 Ms Access 压缩修复压缩修复在Access 工具->数据加实用工具->压缩和修复数据库
    即可修复完毕~

    ASP数据库修复压缩函数参见:
      Access是一种小型的数据库应用系统,在一般的小型的数据库应用系统里面,用它很是方便。但是它有一个极大的缺点,不管是文件里保存的数据有多少,文件只会越来越大,久而久之,文件会大的可怕。

      比如说,你的系统里面在执行一个操作时,每次都要在一个临时表里生成大量的临时数据,用完后你就会删除它。但你会发现,你的MDB文件,大的简直惨不忍睹。

      在我得网站的流量统计系统里面,记录每位访客的访问纪录,用以流量统计。但是过了一段时间,这些记录有就没有保留的必要,所以必须删掉。久而久之,文件的大小简直是几何级增长。

      所以,定期的对Access进行压缩,是十分有必要的。我在这里,列举VB与ASP对Access库进行压缩的两种方式,其均以函数形式提供。其格式声明为:   

    函数名称 第一个参数 第二个参数 
    CompressAccess StringDirectory StringFile 
    Access文件路径 Access文件名称 

    返回值的定义是  True --- 压缩成功      False ---- 压缩失败(未找到压缩目标)

    〖ASP函数〗

      函数原型


    private CompressAccess(StringDirectory,StringFile)

       'designed by PianoPan - Email:PianoPan@BeeShip.com - http://www.BeeShip.com
      Set FS= Server.CreateObject("ing.FileSystemObject") 
      Dim StringTemp
      Dim int_i
      Const JetConnString= "Provider=Microsoft.Jet.OLEDB.4.0; Data source="

      int_i=0

      if FS.FileExists(StringDirectory & StringFile)
        Do
          int_i=int_i+1
          StringTemp=int_i & StringFile
        Loop While FS.FileExists(StringDirectory & StringTemp)

        Set JROe= Server.CreateObject("JRO.JetEngine")
        
        JROe.CompactDatabase JetConnString & StringDirectory & StringFile, JetConnString & StringDirectory & StringTemp

        Set JROe=Nothing

        oFSO.DeleteFile strFolder & StringFile
        oFSO.MoveFile StringDirectory& StringTemp, StringDirectory & StringFile

        CompressAccess=True
      else
        CompressAccess=False
      end if

      Set oFSO = Nothing

    end 

    〖VisualBasic函数〗

      函数原型 

      在VisualBasic中使用本函数时,你必须在你的工程中引用Microsoft Jet and Replication,不要告诉我你不会#$^&*(即在菜单里选择 Project/Reference,找到Microsoft Jet and Replication Object 2.4 Library并选择)。然后就可以在程序中使用此函数。


    Private CompressAccess(StringDirectory As String, StringFile As String) As Boolean

     'designed by PianoPan - Email:PianoPan@BeeShip.com - http://www.BeeShip.com
     on error goto 1

     Dim StringTemp
     Dim int_i
     Const JetConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data source="
     int_i = 0

     If Dir(StringDirectory & StringFile) = StringFile Then
      Do
       int_i = int_i + 1
       StringTemp = int_i & StringFile
      Loop While Dir(StringDirectory & StringTemp) = StringTemp

      Dim JROe As New JRO.JetEngine
      
      JROe.CompactDatabase JetConnString & StringDirectory & StringFile, JetConnString & StringDirectory & StringTemp

      Set JROe = Nothing

      FileSystem.Kill StringDirectory & StringFile
      FileSystem.FileCopy StringDirectory & StringTemp, StringDirectory & StringFile
      FileSystem.Kill StringDirectory & StringTemp

      CompressAccess = True
     Else

      CompressAccess = False
     End If

     Set oFSO = Nothing

    End 

    使用范例

    if CompressAccess ("D:Piano Pan's BoxMy Websxinxin", "db.mdb")=False then msgbox "压缩失败"

    是不是干就两个函数好像一样,没办法,谁让它都是微软的东西。 

    关于ADODB.Field (0x800A0BCD)错误的解决法
    今天有网友向我求助,他的Asp出现这样的错误: 

    错误类型:
    ADODB.Field (0x800A0BCD)
    BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。 
    出现在这样的错误一般属于记录集(recordset)的问题.这类问题发生的原因,一般是执行了查询条件,但送回的结果却是空的,即没有符合查询条件的记录或是执行了循环,执行到第一个或是最后一个记录集的时候,没有及时终止循环,所以产生了错误。
    解決的方法为:
    首先检查查询条件, 确定数据库表的数据不为空。
    你直接在数据库添加一条记录试一下。 

    if rs.eof or rs.bof then
    response.write"找不到你查询的记录集!"
    response.end()
    end if 
    或是遇到没有数据的记录集自动退出记录集: 

    if rs.eof or rs.bof then exit do
    ASP与数据库连接方法详细说明及连接各种数据库代码
    一、ASP的对象存取数据库方法

      在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:

      Connection、Recordset 、Command
      Connection:负责打开或连接数据
      Recordset:负责存取数据表
      Command:负责对数据库执行行动查询命令

    二、连接各数据库的驱动程序

      连接各数据库可以使用驱动程序,也可以使用数据源,不过我建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。

      ODBC链接

      适合数据库类型 链接方式 
    access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;" 
    dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;" 
    Oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;" 
    MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;" 
    MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;" 
    Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;" 
    MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;" 

      OLEDB链接

      适合的数据库类型 链接方式 
    access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;" 
    Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;" 
    MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
    MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties′text;FMT=Delimited′"

      而我们在一般情况下使用Access的数据库比较多,在这里我建议大家连接Access数据库使用下面的方法:


    dim conn
    set conn = server.createobject("adodb.connection")
    conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("../db/bbs.mdb")

      其中../db/bbs.mdb是你的数据库存放的相对路径!如果你的数据库和ASP文件在同一目录下,你只要这样写就可以了:

    dim conn
    set conn = server.createobject("adodb.connection")
    conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("bbs.mdb")

      有许多初学者在遇到数据库连接时总是会出问题,然而使用上面的驱动程序只要你的数据库路径选对了就不会出问题了。

    MS Access数据库连接

    用DSN连接并且没有用户名和密码:

    <%
    set conn = Server.CreateObject("ADODB.Connection")
    conn.open "YourDSNName"
    %>

    用DSN连接并且有用户名和密码:

    <%
    set conn = Server.CreateObject("ADODB.Connection")
    conn.open "YourDSNName","username","password"
    %>

    用实际的数据库绝对路径连接:

    <%
    Set conn = Server.CreateObject("ADODB.Connection")
    Strconn="DRIVER={Microsoft Access Driver (*.mdb)}; "
    Strconn=Strconn & "DBQ=e:yanhangdatabase.mdb" 
    conn.Open Strconn
    %>

    用实际的数据库相对路径连接:

    <%
    Set conn = Server.CreateObject("ADODB.Connection")
    Strconn="DRIVER={Microsoft Access Driver (*.mdb)}; "
    Strconn=Strconn & "DBQ=" & Server.MapPath("/database/yanhang.mdb")
    conn.Open Strconn
    %>



    不用DSN连接:


    转载自http://hi.baidu.com/hcf2142/blog/item/2f4ec18854a40295a4c272cc.html

  • 相关阅读:
    《三体》推荐
    低调做人,高调做事
    注意力的培养是学校教学的真正目的
    【RTP.NET入门系列 一】接收第一个RTP包。
    MapX开发日记(三)GPS项目终于有了眉头
    【RTP.NET入门系列 二】接收第一个RTP帧。
    10.04 flash 乱码 问题
    10.04 中文输入发问题。
    通过值类型进行Timer类的线程的同步。
    关于ManualResetEvent信号机制。
  • 原文地址:https://www.cnblogs.com/watermarks/p/3198958.html
Copyright © 2011-2022 走看看