深圳升蓝软件
数据库开发 .Net技术  |  ASP技术 PHP技术 JSP技术 应用技术类   
Hiblue Software

讨论错误——操作必须是可更新的查询


March 25,2004
这里是微软官方站点对此的解释,通常来说,这个是一个权限问题。

http://support.microsoft.com/support/kb/articles/Q175/1/68.ASP

特征:
下面是使用ADO和ASP遇到这个情况的一种错误代码。

Microsoft OLE DB Provider for ODBC Drivers error ' 80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] 操作必须是一个可更新的查询

原因:
本篇文章描述了三个该错误发生的主要原因以及错误产生区域。尽管这儿引用的是ACCESS数据库,但是对其他类型的数据库也同样适用。

解决办法

这个错误通常是在你对数据库内容做更新或者在试图改变数据库内容的时候产生的,这个错误的发生是因为您的ADO操作由于以下的某个原因而导致写入失败:

1、最普遍的原因是您的INTERNET来宾帐号(Iuser_machine)没有写入数据库(ACCESS)的权限,您可以在浏览器安全设置里给该帐号设置正确的权限。注意:当使用ACCESS和ADO的时候,也必须给该帐号以写目录的权限,也就是存放该MDB文件的地方,这个是因为数据库引擎会建立一个.LDB文件来出路数据库的锁定操作。你同时也应该给INTERNET临时文件夹设置读写权限,因为数据库引擎有可能会在该目录里面建立相关临时文件。

2、第二个原因是数据库的打开方式不对,比如打开方式是不可写的,也会导致该错误,当您使用CONNECTION对象的时候,您可以使用如下代码:
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  
注意,默认的模式是0,一般说来,该模式是允许更新操作的

3、另外一个原因是你有可能在ODBC管理器里把相应的DNS设置里让READ ONLY选项给选中了

4、最后一个原因(FOR SQL),您的操作可能违反了数据库参照完整性,下面是一些普遍的导致该错误的操作:
比如您在试图改变一些不能改变的部件:比如交叉表、SQL PASS-THROUGH,连接,或者UPDATE操作一些已经设置为唯一的选项,比如一个自动编号的ID等等。
还有一个普遍的原因是你的JOIN操作包含了没有唯一索引的关联表,在这种情况下,SQL无法保证您要试图更新的表里的数据是唯一的。

任何一种原因都可能发生在很多情况下面,当您试图去更新一和一对多的联合,也会发生这个错误,除非允许层叠更新,请注意实施数据参照完整性

希望能对你有所帮助。
       
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved