34

当我尝试运行我的 SQL 时,我收到一条错误消息:“操作必须使用可更新查询”。据我了解,在 MS Access 的更新/删除查询中使用连接时会发生这种情况。但是,我有点困惑,因为我的数据库中有另一个几乎相同的查询,它工作正常。

这是我的麻烦查询:

UPDATE [GS] INNER JOIN [Views] ON 
    ([Views].Hostname = [GS].Hostname) 
    AND ([GS].APPID = [Views].APPID) 
    SET 
        [GS].APPID = [Views].APPID, 
        [GS].[Name] = [Views].[Name], 
        [GS].Hostname = [Views].Hostname, 
        [GS].[Date] = [Views].[Date], 
        [GS].[Unit] = [Views].[Unit], 
        [GS].[Owner] = [Views].[Owner];

正如我之前所说,我很困惑,因为我有另一个与此类似的查询,它运行完美。这是那个查询:

UPDATE [Views] INNER JOIN [GS] ON 
[Views].APPID = [GS].APPID 
SET 
    [GS].APPID = [Views].APPID, 
    [GS].[Name] = [Views].[Name], 
    [GS].[Criticial?] = [Views].[Criticial?], 
    [GS].[Unit] = [Views].[Unit], 
    [GS].[Owner] = [Views].[Owner];

我的第一个查询有什么问题?为什么第二个查询有效,而第一个查询无效?

4

12 回答 12

27

代码中没有错误,但是由于以下原因而抛出错误:

 - Please check whether you have given Read-write permission to MS-Access database file.
 - The Database file where it is stored (say in Folder1) is read-only..? 

假设您将数据库(MS-Access 文件)存储在只读文件夹中,而在运行您的应用程序时,连接并未强制完全打开。因此,更改文件权限/其包含文件夹权限,就像在C:\Program files所有大多数 C 驱动器文件中设置为只读一样,因此更改此权限可以解决此问题。

于 2013-12-06T09:50:20.117 回答
22

这个答案是否普遍正确,我不知道,但我通过稍微改变我的查询来解决这个问题。

我没有将选择查询连接到表并对其进行处理,而是更改了选择查询以创建一个临时表。然后我将该临时表用于真实表,并且一切正常。

于 2013-11-05T14:08:03.417 回答
19

我在尝试更新链接表时遇到了同样的错误。

问题是链接表没有主键。

在数据库端添加主键约束并将此表重新链接到访问问题后得到解决。

希望它会帮助某人。

于 2015-09-23T10:50:53.133 回答
16

我有同样的问题,我不记得我是如何喜欢这个解决方案的,只是简单地添加DISTINCTROW解决了这个问题。

在您的代码中,它将如下所示:

UPDATE DISTINCTROW [GS] INNER JOIN [Views] ON <- the only change is here
    ([Views].Hostname = [GS].Hostname) 
    AND ([GS].APPID = [Views].APPID) 
 ...

我不确定为什么会这样,但对我来说,它完全符合我的需要。

于 2017-06-13T10:09:04.077 回答
4

要更新记录,您需要将更改写入磁盘上的 .mdb 文件。如果您的网络/共享应用程序无法写入磁盘,则您无法更新现有记录或添加新记录。因此,在数据库文件夹中启用读/写访问权限或将数据库移动到您的应用程序具有写权限的其他文件夹....有关更多详细信息,请检查:

http://www.beansoftware.com/ASP.NET-FAQ/Operation-Must-Use-An-Updateable-Query.aspx

于 2016-06-19T10:32:04.300 回答
3

设置应用程序目录的权限和我一起解决这个问题

要设置此权限,请右键单击 App_Data 文件夹(或您将文件放入的任何其他文件夹)并选择属性。查找安全选项卡。如果看不到它,则需要转到我的电脑,然后单击工具并选择文件夹选项...。​​然后单击查看选项卡。滚动到底部并取消选中“使用简单文件共享(推荐)”。返回“安全”选项卡,您需要将相关帐户添加到“组或用户名”框中。单击添加...,然后单击高级,然后单击立即查找。应列出适当的帐户。双击它以将其添加到组或用户名框中,然后检查权限中的修改选项。而已。你完成了。

于 2014-05-19T06:46:24.980 回答
2

我使用了一个临时表,终于让它工作了。这是创建临时表后使用的逻辑:

UPDATE your_table, temp
SET your_table.value = temp.value
WHERE your_table.id = temp.id
于 2017-01-04T16:46:05.330 回答
1

我遇到了同样的错误,使用主键并没有什么不同。问题是该表是一个链接的 Excel 表。我知道有设置可以更改,但我的 IT 部门已锁定此设置,因此我们无法更改。相反,我从链接表创建了一个生成表,并在我的更新查询中使用它,它工作正常。请注意,查询中也链接到同一个 Excel 链接表的任何查询都将导致相同的错误,因此您还需要更改这些查询,以便它们不直接链接到 Excel 链接表。HTH

于 2019-07-08T11:43:45.663 回答
0

这是在黑暗中的一个镜头,但尝试将 AND 的两个操作数放在括号中

开((A = B)和(C = D))

于 2013-11-05T13:33:07.647 回答
0

我正在使用 UNC 路径访问数据库,偶尔会引发此异常。当我用IP地址替换计算机名称时,问题突然解决了。

于 2017-04-03T11:39:59.797 回答
0

如果要更新,必须删除 IMEX=1。;)

“IMEX=1;告诉驱动程序始终将“混合”(数字、日期、字符串等)数据列作为文本读取。请注意,此选项可能会影响 Excel 工作表写入访问权限。 https://www.connectionstrings.com/excel/

于 2020-11-19T23:23:04.210 回答
-4
UPDATE [GS] INNER JOIN [Views] ON 
([Views].Hostname = [GS].Hostname) 
AND ([GS].APPID = [Views].APPID) <------------ This is the difference 
SET 
    [GS].APPID = [Views].APPID, 
    [GS].[Name] = [Views].[Name], 
    [GS].Hostname = [Views].Hostname, 
    [GS].[Date] = [Views].[Date], 
    [GS].[Unit] = [Views].[Unit], 
    [GS].[Owner] = [Views].[Owner];
于 2015-03-31T04:30:15.367 回答