错误“操作必须使用一个可更新的查询”这里我整理下原因及解决办法,大家以后再遇到
相同的问题可以先试下类似的解决办法.
错误信息:
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 工具->数据加实用工具->压缩和修复数据库
即可修复完毕~
http://access911.net/fixhtm/77FAB61E14DC.htm?tt= 两个表用Where子句关联,然
后更新为何出错?(操作必须使用一个可更新的查询)
http://topic.csdn.net/t/20050427/10/3969700.html 有哪位高手知道,不通过编程
让Access数据库中的两张表的某些字段保持同步!
http://blog.csdn.net/bingdian37/archive/2007/09/24/1798987.aspx Access
update语句 提示 "操作必须使用一个可更新的查询"
http://www.tmxkw.com/dir/show.asp?id=1668 Access中"''80004005''"操作必须使
用一个可更新的查询"错误的解决办法
http://www.qqgb.com/Program/VB/VBJQ/Program_169113.html 请教关于得分排名疑难
http://topic.csdn.net/t/20060522/14/4769673.html access中如何用substring函
数,谢谢!
结论:本次“操作必须使用一个可更新的查询”是由于“ACCESS更新Update语句不支持聚
集函数”,可改换方法:参考如下问题与答案:
问题:两个表用Where子句关联,然后更新为何出错?
update a set a.fb=b.fb where a.fa=b.fa
回答:
注意:在回答问题前提示大家,应尽量使用ACCESS环境所特有的“域函数”,比如
DLOOKUP DSUM DCOUNT DMAX DMIN 等等,具体的操作方法请查询帮助。
比如:
update a set a.fb=dlookup("fb","b","b.fa=" & a.fa)
这个问题经常发生在从其他中大型数据库开发者转到用 jet db 4 的Access的时候
Access中不允许用where tableA.fieldA = TableB.fieldA 来做update的连接,这是
T-sql的语法,在当初教T-sql的时候你们老师应该说过这句语句使用的注意要点吧?
必须把t-sql的语法转成Asni的语法,用 join 来做。
UPDATE a INNER JOIN b ON a.fa = b.fa SET a.fb = b.fb;
另外,b.fb不应该是重复的。即要求是主键或唯一索引。