【问题标题】:"Operation must use an updateable query" error in MS AccessMS Access 中的“操作必须使用可更新查询”错误
【发布时间】:2013-11-16 08:52:04
【问题描述】:

当我尝试运行我的 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];

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

【问题讨论】:

    标签: ms-access


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 啊,所以 [Views] 是一个已保存的查询,是吗?它是否偶然进行了任何聚合 (GROUP BY) 或任何其他会使 结果集“不可更新”的事情?
    • 我认为这就是问题所在。有一个分组,即使结果很好,分组通过访问。你每天都学一点!
    • 除了创建一个表来代替select query之外别无他法?
    【解决方案3】:

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

     - 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 驱动器文件都已设置为 只读,因此更改此权限可以解决此问题。

    【讨论】:

    • 这是此类问题的合理原因,但我认为这不是最常见的原因。我认为主键问题是一个更常见的原因。当我自己遇到它时,这是因为我已经链接到一个聚合查询,该查询有效地删除了主键。我可以通过将聚合查询放入一个临时表来解决这个问题,就像提问者最终在他的情况下所做的那样。
    • 我的情况是权限问题
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
      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];
      

      【讨论】:

        【解决方案6】:

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

        问题是链接表没有主键。

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

        希望它对某人有所帮助。

        【讨论】:

        • 其实今天对我有帮助! :) 关键是我有两张完全相同的表,都没有主键(不要问我,我也不知道原因),其中一张完美无缺,另一张我有错误。
        【解决方案7】:

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

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

        【讨论】:

        • 虽然正确,但这并没有真正添加任何新内容。
        • 实际上这对我来说是正确的答案,在我发布应用程序之前一切正常,安装程序将应用程序安装在 C: 驱动器上,删除了写权限,我刚刚启用了安装的写权限文件夹,一切都按预期工作
        【解决方案8】:

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

        UPDATE your_table, temp
        SET your_table.value = temp.value
        WHERE your_table.id = temp.id
        

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
          • @arghtype 这个实际上提出了一种方法并且是一个有效的答案,但是如果它有效或不能解决问题,那就是要考虑的事情了。
          • @arghtype 评论我不同意这不是一个有效的答案。我的问题与所描述的问题明显相似,并且我提供的解决方案对我有用。我想与其他人分享我获得的知识,因为它也可能有助于解决他们的问题。我没有看到逻辑,为什么它不是一个有效的答案,你能更详细地解释一下吗?
          【解决方案10】:

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

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

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

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

          【讨论】:

          • 如果有人能就这个答案解释 DISTINCTROW 工作的原因(甚至三年后),那么将不胜感激。
          • 这是因为当您选择或只想更新一个表中的字段时,DISTINCTROW 忽略了连接视图(或表)的输出。如果您不使用它,它将从不可更新视图中检索最终重复的记录,从而使整个 UPDATE 语句不可更新。我的猜测是 MSAccess 会将其视为从视图更新数据的尝试。见:support.office.com/en-gb/article/…
          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-15
              • 2010-10-03
              • 1970-01-01
              相关资源
              最近更新 更多