Хобрук: Ваш путь к мастерству в программировании

Операция должна использовать обновляемую ошибку запроса в MS Access.

Я получаю сообщение об ошибке: «Операция должна использовать обновляемый запрос», когда я пытаюсь запустить свой 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];

Что не так с моим первым запросом? Почему второй запрос работает, а первый нет?

05.11.2013

Ответы:


1

В коде нет ошибки, но ошибка возникает из-за следующего:

 - 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 были установлены только для чтения, поэтому изменение этого разрешения решает эту проблему.

06.12.2013
  • Это законная причина такого рода проблем, но я не думаю, что это самая распространенная причина. Я думаю, что проблема с первичным ключом является более распространенной причиной. Когда я столкнулся с этим сам, это произошло потому, что я связался с агрегированным запросом, который фактически удалил первичный ключ. Потенциально я мог бы обойти это, поместив совокупный запрос во временную таблицу, как это сделал автор вопроса в своей ситуации. 03.03.2019
  • проблема с разрешением была в моем случае 12.08.2019

  • 2

    Является ли этот ответ универсально верным или нет, я не знаю, но я решил эту проблему, немного изменив свой запрос.

    Вместо того, чтобы присоединять запрос выбора к таблице и обрабатывать его, я изменил запрос выбора, чтобы создать временную таблицу. Затем я использовал эту временную таблицу для реальной таблицы, и все заработало отлично.

    05.11.2013
  • Ах, так [Просмотры] были сохраненным запросом, не так ли? Случайно ли он выполнил какие-либо агрегации (GROUP BY) или что-то еще, что сделало бы его набор результатов недоступным для обновления? 06.11.2013
  • Я думаю, что дело было в этом. Была группировка и хотя результаты были в порядке, группировка через Access. Вы учитесь понемногу каждый день! 06.11.2013
  • Нет ли другого способа, кроме как создать таблицу вместо select query? 08.06.2015

  • 3

    У меня была такая же ошибка, когда я пытался обновить связанную таблицу.

    Проблема заключалась в том, что связанная таблица не имела PRIMARY KEY.

    После добавления ограничения первичного ключа на стороне базы данных и повторного связывания этой таблицы с доступом проблема была решена.

    Надеюсь, это поможет кому-то.

    23.09.2015
  • На самом деле это помогло мне сегодня! :) Дело в том, что у меня было две абсолютно одинаковые таблицы, обе без Первичных Ключей (не спрашивайте меня об этом, я тоже понятия не имею о причине) и с одной из них работало без нареканий, с другой у меня было Ошибка. 17.02.2017

  • 4

    У меня была точно такая же проблема, и я не могу вспомнить, как мне понравилось это решение, но простое добавление DISTINCTROW решило проблему.

    В вашем коде это будет выглядеть так:

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

    Я не уверен, почему это работает, но для меня это было именно то, что мне было нужно.

    13.06.2017
  • Если кто-нибудь может разъяснить этот ответ о причине, по которой DISTINCTROW работает (даже три года спустя), то это будет оценено. 10.03.2020
  • Это связано с тем, что DISTINCTROW пропускает вывод из объединенного представления (или таблицы), когда вы выбираете или хотите обновить только поля из одной таблицы. Если вы его не используете, он извлечет возможные дублированные записи из необновляемого представления, сделав весь оператор UPDATE необновляемым. Я предполагаю, что MSAccess воспримет это как попытку обновить данные из представления. См.: support.office.com/ru-ru/article/ 28.05.2020

  • 5

    установить разрешение на каталог приложения решить эту проблему со мной

    Чтобы установить это разрешение, щелкните правой кнопкой мыши папку App_Data (или любую другую папку, в которую вы поместили файл) и выберите «Свойства». Найдите вкладку «Безопасность». Если вы не видите его, вам нужно перейти в «Мой компьютер», затем нажать «Инструменты» и выбрать «Свойства папки...», затем перейти на вкладку «Вид». Прокрутите вниз и снимите флажок «Использовать простой общий доступ к файлам (рекомендуется)». Вернувшись на вкладку «Безопасность», вам нужно добавить соответствующую учетную запись в поле «Имена групп или пользователей». Нажмите «Добавить...», затем нажмите «Дополнительно», затем «Найти сейчас». Соответствующая учетная запись должна быть указана. Дважды щелкните его, чтобы добавить в поле «Имена групп или пользователей», затем установите флажок «Изменить» в разрешениях. Вот и все. Вы сделали.

    19.05.2014

    6

    Для обновления записей необходимо записать изменения в файл .mdb на диск. Если ваше веб-приложение или совместно используемое приложение не может записывать на диск, вы не можете обновлять существующие или добавлять новые записи. Итак, включите доступ для чтения/записи в папке базы данных или переместите базу данных в другую папку, где у вашего приложения есть разрешение на запись.... для более подробной информации, пожалуйста, проверьте:

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

    19.06.2016
  • Хотя это правильно, это не добавляет ничего нового. 19.06.2016
  • На самом деле это правильный ответ для меня, все работало нормально, пока я не опубликовал приложение, установщик установил приложение на диск C:, что удалило разрешение на запись, я просто включил разрешение на запись в папке установки, и все работало как положено 25.11.2018

  • 7

    Я использовал временную таблицу и, наконец, заставил ее работать. Вот логика, которая используется после создания временной таблицы:

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

    8

    Я получил ту же ошибку, и использование первичного ключа не имело значения. Проблема заключалась в том, что таблица является связанной таблицей Excel. Я знаю, что есть настройки, чтобы изменить это, но мой ИТ-отдел заблокировал это, поэтому мы не можем это изменить. Вместо этого я создал таблицу make из связанной таблицы и использовал ее в своем запросе на обновление, и это сработало. Обратите внимание, что любые запросы в вашем запросе, которые также связаны с одной и той же связанной таблицей Excel, вызовут ту же ошибку, поэтому вам также нужно будет изменить их, чтобы они не были напрямую связаны со связанной таблицей Excel. ХТН

    08.07.2019

    9

    Это выстрел в темноту, но попробуйте поместить два операнда для И в круглых скобках

    На ((А=В) И (С=D))

    05.11.2013
  • К сожалению, безуспешно 05.11.2013
  • попробуйте эту ссылку, это похоже на вашу проблему. Надеюсь, что это работает. stackoverflow.com/questions/9894353/ 05.11.2013
  • Там совсем другой подход 05.11.2013

  • 10

    Я обращался к базе данных, используя путь UNC, и иногда возникало это исключение. Когда я заменил имя компьютера на IP-адрес, проблема внезапно разрешилась.

    03.04.2017
  • Это не дает ответа на вопрос. Получив достаточную репутацию, вы сможете /comment">прокомментировать любой пост; вместо этого дайте ответы которые не требуют разъяснений от спрашивающего. – Из обзора 04.04.2017
  • @arghtype Этот на самом деле предлагает подход и является правильным ответом, однако, работает он или нет для решения проблемы, это еще что-то, что следует учитывать. 05.04.2017
  • @arghtype Обзор Я не согласен с тем, что это неверный ответ. У меня была явно похожая проблема с описанной, и решение, которое я предоставил, сработало для меня. Я хотел поделиться своими знаниями с другими, так как это может помочь решить их проблемы. Я не вижу логики, почему это неверный ответ, можете ли вы объяснить это более подробно? 05.04.2017

  • 11

    Вы должны удалить IMEX=1, если хотите обновить. ;)

    ИМЭКС=1; указывает драйверу всегда читать смешанные столбцы данных (числа, даты, строки и т. д.) как текст. Обратите внимание, что этот параметр может повлиять на доступ для записи к листу Excel. https://www.connectionstrings.com/excel/

    19.11.2020
    Новые материалы

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..