Невозможно выполнить оператор обновления в ucanaccess

1

У меня есть подключение к базе данных Microsoft Access. Как только я сделаю соединение, я пытаюсь получить все из этой таблицы, к которой я обращаюсь со следующим запросом.

ResultSet rSet = stmt.executeQuery("Select * FROM DraftNightQuery")

Насколько я могу сказать, это прекрасно работает. Затем я получаю цикл while, который работает до тех пор, пока rSet.nex().

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

connec.executeUpdate("UPDATE DraftNightQuery SET OwnerID='"+x+"' WHERE Last='"+split[0]+"' AND First='"+split[1]+ "' ");

и он бросает эту ошибку:

 net.ucanaccess.jdbc.UcanaccessSQLException: INSERT, UPDATE, DELETE or TRUNCATE not permitted for table or view

Я предполагаю, что это как-то связано с самим запросом на обновление, однако это сработало для ODBC, и из того, что я могу сказать на веб-сайте UCanAccess, он должен работать и на этом.

редактировать:

SQL для запроса, бросающего PUBLIC.NZ(DOUBLE):

SELECT TotalStats.ID, Players.First, Players.Last, (Nz([TotalStats].[W]*25))-(Nz([TotalStats].[L]*5))+(Nz([TotalStats].[PG]*10))+(Nz([TotalStats].[QS]*10))+(Nz([TotalStats].[SV]*20))-(Nz([TotalStats].[BS]*5))+(Nz([TotalStats].[Holds]*15))+(Nz([TotalStats].[GF]*5))+(Nz([TotalStats].[Innings]*3))-(Nz([TotalStats].[PH]*1))-(Nz([TotalStats].[ER]*2))-(Nz([TotalStats].[PHR]*8))-(Nz([TotalStats].[PBB]*3))+(Nz([TotalStats].[PK]*5))-(Nz([TotalStats].[PHB]*3))-(Nz([TotalStats].[WP]*1))+(Nz([TotalStats].[CG]*50))+(Nz([TotalStats].[ShO]*75)) AS Points, Owners.TeamName, Players.OwnerID, Players.PositionType
FROM Owners RIGHT JOIN (Players LEFT JOIN TotalStats ON Players.ID = TotalStats.ID) ON Owners.OwnerID = Players.OwnerID
WHERE (((Players.PositionType)="Pitch") AND ((Players.DraftStatus)="Drafted"))
ORDER BY (Nz([TotalStats].[W]*25))-(Nz([TotalStats].[L]*5))+(Nz([TotalStats].[PG]*10))+(Nz([TotalStats].[QS]*10))+(Nz([TotalStats].[SV]*20))-(Nz([TotalStats].[BS]*5))+(Nz([TotalStats].[Holds]*15))+(Nz([TotalStats].[GF]*5))+(Nz([TotalStats].[Innings]*3))-(Nz([TotalStats].[PH]*1))-(Nz([TotalStats].[ER]*2))-(Nz([TotalStats].[PHR]*8))-(Nz([TotalStats].[PBB]*3))+(Nz([TotalStats].[PK]*5))-(Nz([TotalStats].[PHB]*3))-(Nz([TotalStats].[WP]*1))+(Nz([TotalStats].[CG]*50))+(Nz([TotalStats].[ShO]*75)) DESC;
  • 0
    Не используйте один и тот же объект оператора для запроса и обновления.
  • 0
    @gknicker Я должен указать, однажды в цикле я снова говорю stmt = con.createStatement. Еще лучше просто использовать другую переменную целиком?
Показать ещё 14 комментариев
Теги:
ms-access
ucanaccess

2 ответа

2

Я вижу два разных вопроса:

-An проблема с nz (double). Я только что внедрил nz (текст), поэтому в следующей версии будет исправлено отсутствие исправления (которое я выпущу как можно скорее, вероятно, в течение следующей недели).

-The второй - это использование оператора sql update для запроса. Запросы выбора доступа не являются физическими таблицами, даже если они могут выглядеть. Они просто выбирают запросы. Если вы выполняете обновление по выбранным запросам, доступ может обновлять данные в базовых таблицах: таблицы, используемые в запросе и участвующие в обновлении. Так что это что-то сложное, что может сделать двигатель Jet, а также может привести к неправильному и нечеткому SQL-коду, если он неправильно используется. UCanAccess полагается на Hsqldb, который во многих случаях не позволяет операторам обновлений делать представления. Поэтому вам нужно вызвать оператор SQL update непосредственно в таблице, которую вы хотите обновить.

Обратите внимание, что hsqldb поддерживает некоторые дополнительные функции из стандарта SQL 2003 (например, MERGE INTO), которые работают с UCanAccess и в некоторых случаях могут работать как "умное" (но стандартное) решение для замены ваших требований (см. Эту тему).

  • 2
    Спасибо за понимание. В итоге я последовал совету @ GordThompson и просто отредактировал исходную таблицу, которая, кажется, выполняет свою работу достаточно хорошо. Хотя ошибка NZ (double) все еще существует, в настоящее время я не пытаюсь что-либо сделать с этим запросом, так что ничего особенного.
0

Вы не можете обновить resulset с помощью запроса SELECT STANDARD, используя UCanAccess. У вас есть два варианта:

  1. Используя PreparedStatement с этими параметрами ("SELECT * FROM YourTableName", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT). Выполните команду для создания набора результатов с помощью ExecuteQuery(). Наконец, обновите свой набор результатов, называя эти два метода: UpdateString (если тип поля - String) и UpdateRow.
  2. Используйте 2 утверждения:

    st1 = conn.createStatement();
    rs = st1.executeQuery("SELECT * FROM MyTable");
    while(rs.next()) {
        st2 = conn.createStatement();
        st2.executeUpdate("UPDATE MyTable SET MyField='New Value' WHERE MyField2 LIKE 'Condition'");
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню