JDBC / Access: у пользователя нет прав или объект не найден

Я пытаюсь вставить кортеж из входного отношения INPUTRel в исходное отношение UK_RD_Spend с внешним ключом, а затем обновить кортеж целевого отношения UK_Status. UK_Status и UK_RD_Spend имеют отношение первичный ключ-внешний ключ.

Вот параметры: INPUTRel: TransId, Company, ICB_Code, RD2008 UK_RD_Spend: Company, ICB_Code, RD_spend_2008 UK_Status: Company: RD08

Итак, я вставляю кортеж из INPUTRel в UK_RD_Spend. Это удалось. Но когда я пытаюсь обновить кортеж UK_Status, он вернул SQLException.

Я пытаюсь обновить RD08, но мне также нужно проверить, не нарушается ли ограничение внешнего ключа (если название компании не существует в UK_RD_Spend). Однако я получаю следующие ошибки:

SQLException: UCAExc:::4.0.3 user lacks privilege or object not found: 

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

String queryFK = "SELECT * FROM UK_Status WHERE Company = "
                    + company + "";
            pstmt = conn.prepareStatement(queryFK);
            pstmt.setString(1, company);
            pstmt.setDouble(2, RD2008);
            String msg1;
            try {
                pstmt.executeUpdate();

            } catch (SQLException se) {
                // Check FK Violation: company must exist
                if (t2.get(company).getCompany() == null) {
                // or this ?->
                // if
                // (!(conn.createStatement()).executeQuery(queryFK).next())
                // {
                    String ICB_CodeTest = Integer.toString(ICB_Code);
                    String RD2008Test = Double.toString(RD2008);
                    ICB_CodeTest = ICB_CodeTest.replaceAll("\\s+", "");
                    RD2008Test = RD2008Test.replaceAll("\\s+", "");
                    msg1 = "Transaction "
                            + tid
                            + " failed due to a FK constraint, for the following values of the input; ("
                            + company + ", " + ICB_Code + ", " + RD2008
                            + ")";
                    String fk2 = "INSERT INTO OUTPUTRel"
                            + "(TransId, RunMessages) " + "values (?, ?)";
                    pstmt = conn.prepareStatement(fk2);
                    pstmt.setInt(1, tid);
                    pstmt.setString(2, msg1);
                    pstmt.execute();
                    pstmt.close();
                    continue;
                }
            }
            //
            String companyName = t2.get(company).getCompany();
            Status s = t2.get(companyName);
            s.setRD2008(RD2008);

            String query = "UPDATE UK_Status SET RD08 = ? WHERE Company = ?";
            pstmt = conn.prepareStatement(query);
            pstmt.setDouble(1, s.getRD2008());
            pstmt.setString(2, company);

            int number = (int) s.getRD2008();

            if (number < ICB_Code) {
                msg = "Transaction "
                        + tid
                        + " succeeded for the following values of the input; ("
                        + company + ", " + ICB_Code + ", " + RD2008 + ")";
                pstmt.execute();
                // Finally insert execution result on the output table.
                String oo = "INSERT INTO OUTPUTRel"
                        + "(TransId, RunMessages) " + "values (?, ?)";
                pstmt = conn.prepareStatement(oo);
                pstmt.setInt(1, tid);
                pstmt.setString(2, msg);
                pstmt.execute();
                pstmt.close();
            } else {
                msg = "Transaction "
                        + tid
                        + " failed due to a dynamic constraint, for the following values of the input; ("
                        + company + ", " + ICB_Code + ", " + RD2008 + ")";
                // Finally insert execution result on the output table.
                String dynamicFail = "INSERT INTO OUTPUTRel"
                        + "(TransId, RunMessages) " + "values (?, ?)";
                pstmt = conn.prepareStatement(dynamicFail);
                pstmt.setInt(1, tid);
                pstmt.setString(2, msg);
                pstmt.execute();
                pstmt.close();
            }
        }

person ABComputer    schedule 20.02.2018    source источник


Ответы (1)


String queryFK = "SELECT * FROM UK_Status WHERE Company = "
                + company + "";
        pstmt = conn.prepareStatement(queryFK);
        pstmt.setString(1, company);
        pstmt.setDouble(2, RD2008);
        String msg1;
        try {
            pstmt.executeUpdate();

        } catch (SQLException se) {

Ваш оператор не может использоваться как PreparedStatement, потому что вы вводите значение вместо ?. Вот где ошибка возникает из-за BTW, потому что вы не указали значение, поэтому база данных ищет столбец с названием компании, а не ищет строку со значением company в столбце `Company '.

Также вы выполняете оператор, используя executeUpdate, который не будет работать с оператором select и не вернет набор результатов, который вы можете перебирать.

person Lothar    schedule 20.02.2018
comment
Я попытался изменить подготовленное Заявление на Заявление, но это не позволило мне. Я пробовал сменить "компанию" на "?" мне это тоже не позволит. Что мне делать, чтобы это исправить? Спасибо - person ABComputer; 21.02.2018
comment
Я пробовал сменить + компанию + на? , теперь ошибка Недействительный аргумент в вызове JDBC: индекс параметра вне диапазона: 2 - person ABComputer; 21.02.2018
comment
@ABComputer Это исходит из setDouble, где вы пытаетесь установить второй параметр оператора только с одним параметром. - person Lothar; 21.02.2018
comment
Итак, я просто удалил setString и setDouble, это правильно? Что касается ловушки, я решил попробовать {pstmt.execute (); } catch (SQLException se) {if (se.getSQLState (). equals (S1000)) {.... теперь, когда я запускаю, каждая транзакция просто выдает сообщение о сбое из-за нарушения ограничения FK .. - person ABComputer; 21.02.2018
comment
Или, если я не делаю S1000, вместо этого я изменяю оператор if на: if (! (Conn.createStatement ()). ExecuteQuery (queryFK) .next ()), я получу nullPointerException для этой строки: String companyName = t2.get (компания) .getCompany (); @Lothar - person ABComputer; 21.02.2018
comment
@ABComputer Я не знаю, что такое t2, и я думаю, что ответил на ваш первоначальный вопрос. Дальнейшие вопросы о разных вещах следует задавать в новом вопросе. - person Lothar; 21.02.2018
comment
t2 - это хэш-карта отношения UK_Status. это ‹String, Double›. - person ABComputer; 21.02.2018
comment
Спасибо за помощь, я не могу отправить сообщение через 90 минут, но у меня нет времени. ошибка - у пользователя отсутствуют права доступа или объект не найден: MEGGITT Meggitt - компания первого кортежа INPUTRel. Он успешно вставлен в, так что теперь у моего UK_RD_Spend есть два меггита с уникальным ICB_Code. Но при попытке обновить компанию (Meggitt) и RD08 io UK_Status выдает ошибку. Если я удалю ограничение if conditionfort fk, оно покажет «nullpointerexception» для моего t2.get(company).getCompany(); getCompany - это метод для возврата this.company; в классе RD08. Класс RD08 - это значение карты t1 (UK_RD_Spend) - person ABComputer; 21.02.2018