有几个主要的错误原因:
这个错误发生在当你的程序试图执行更新数据库或其它类似操作时。这是因为
ADO由于以下的几个原因而不能够写数据库造成的。
1。最普遍的原因是匿名用户帐号(IUSR_MACHINE)对该数据库文件没有写权限。
要解决这个问题,在管理器中调整数据库文件的属性,让匿名用户有正确的权限。
当使用ACCESS数据库时,不仅要给文件写的权限,还要给该目录写的权限,因为
Jet需要在该目录建立一个.ldb文件。
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)
中的查询时,在执行这个查询是会出现该错误。
---------------------------------------------
下面是另外一篇讲此问题的,内容相似,放在一起了:
这里是微软官方站点对此的解释,通常来说,这个是一个权限问题。
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无法保证您要试图更新的表里的数据是唯一的。
任何一种原因都可能发生在很多情况下面,当您试图去更新一和一对多的联合,也会发生这个错误,除非允许层叠更新,请注意实施数据参照完整性
这个错误发生在当你的程序试图执行更新数据库或其它类似操作时。这是因为
ADO由于以下的几个原因而不能够写数据库造成的。
1。最普遍的原因是匿名用户帐号(IUSR_MACHINE)对该数据库文件没有写权限。
要解决这个问题,在管理器中调整数据库文件的属性,让匿名用户有正确的权限。
当使用ACCESS数据库时,不仅要给文件写的权限,还要给该目录写的权限,因为
Jet需要在该目录建立一个.ldb文件。
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)
中的查询时,在执行这个查询是会出现该错误。
---------------------------------------------
下面是另外一篇讲此问题的,内容相似,放在一起了:
这里是微软官方站点对此的解释,通常来说,这个是一个权限问题。
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无法保证您要试图更新的表里的数据是唯一的。
任何一种原因都可能发生在很多情况下面,当您试图去更新一和一对多的联合,也会发生这个错误,除非允许层叠更新,请注意实施数据参照完整性
操作必须使用一个可更新的查询 解决办法
出错举例:
Microsoft JET Database Engine (0x80004005)
操作必须使用一个可更新的查询。
/LeadBBS/inc/Board_Popfun.asp, 第 569 行
需要权限:服务器管理员,否则联系服务器管理员进行
示例操作系统:Windows 2000 Server
1.找到你存放网站的文件夹,比如你的网站存放在D:/WEB/News.com
右键点击文件夹,选择属性
点击小图查看大图
2.出来新窗口,选择安全,点击按钮添加( D)
点击小图查看大图
3.在出来的窗口中,找到IUSER_开头的名称,并双击,点击确定.
点击小图查看大图
4.确定后的结果是这个窗口,在安全的名称列表中多了刚才选择的用户
点击下面的按钮 高级( V)...
点击小图查看大图
5.在弹出的新小窗口中,继续点击 查看/编辑( V) 按钮
点击小图查看大图
6.出来新窗口..
点击小图查看大图
7.重新选择权限分配.
点击小图查看大图
8.点击应用完成设置
Microsoft JET Database Engine (0x80004005)
操作必须使用一个可更新的查询。
/LeadBBS/inc/Board_Popfun.asp, 第 569 行
需要权限:服务器管理员,否则联系服务器管理员进行
示例操作系统:Windows 2000 Server
1.找到你存放网站的文件夹,比如你的网站存放在D:/WEB/News.com
右键点击文件夹,选择属性

点击小图查看大图
2.出来新窗口,选择安全,点击按钮添加( D)

点击小图查看大图
3.在出来的窗口中,找到IUSER_开头的名称,并双击,点击确定.

点击小图查看大图
4.确定后的结果是这个窗口,在安全的名称列表中多了刚才选择的用户
点击下面的按钮 高级( V)...

点击小图查看大图
5.在弹出的新小窗口中,继续点击 查看/编辑( V) 按钮

点击小图查看大图
6.出来新窗口..

点击小图查看大图
7.重新选择权限分配.

点击小图查看大图
8.点击应用完成设置
在做网页计数器的时候发现的问题,无论是用文件来记录访问次数还是用数据库来记录都是提示“
操作必须使用一个可更新的查询”的错误。看网上的回答都说是“访问权限”的问题。
一般来说,这个问题会发生在磁盘格式为NTFS的情况下,由于这个格式加入了安全性的控制,但是在XP的系统下文件夹的被默认为“默认共享”,在“属性”选项卡里是找不到“安全性”这项的。因此应该更改这项设置。方法叙述如下:
打开任意一个文件目录,点击“工具”->“文件夹选项”->“查看”,找到“使用简单文件共享(推荐)”这项,把前面的勾去掉。
在网站所在文件夹上单击右键,选择“属性”,这时就能找到“安全”的选项卡,添加一个用户Everyone,权限设为“完全控制”,这样任何人都对你的网站目录有读写权限了,问题得以解决。
一般来说,这个问题会发生在磁盘格式为NTFS的情况下,由于这个格式加入了安全性的控制,但是在XP的系统下文件夹的被默认为“默认共享”,在“属性”选项卡里是找不到“安全性”这项的。因此应该更改这项设置。方法叙述如下:
打开任意一个文件目录,点击“工具”->“文件夹选项”->“查看”,找到“使用简单文件共享(推荐)”这项,把前面的勾去掉。
在网站所在文件夹上单击右键,选择“属性”,这时就能找到“安全”的选项卡,添加一个用户Everyone,权限设为“完全控制”,这样任何人都对你的网站目录有读写权限了,问题得以解决。