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 Box\My Webs\xinxin\", "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:\yanhang\database.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

转载于:https://www.cnblogs.com/watermarks/p/3198958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值