Невозможно передать значения в PreparedStatement - последний пятый аргумент пропущен - PullRequest
0 голосов
/ 06 июля 2018

У меня следующая проблема.У меня есть метод, который использует запрос, чтобы проверить, есть ли резервирование для данного места во времени от начала до конца, чтобы проверить, может ли пользователь забронировать это место в данное время, а затем возвращает Ture of False.Моя проблема в том, что каждый раз, когда мой ResultSet равен нулю.Я делаю шаг за шагом отладку, и все переменные передаются правильно.С помощью отладчика я обнаружил, что после передачи 4 аргументов (дата начала 2-го раза) пятый пропускается, а значение myRs остается нулевым.Кроме того, четвертый аргумент после прохождения подчеркивается зеленой линией, но связь не отображается.Я использую Netbeans.Я понятия не имею, что происходит.Вот мой код метода DBUtil:

public boolean doesBookExist(int number, Date start, Date end) throws Exception {

    boolean result = false;

    Connection myConn = null;
    PreparedStatement myStmt = null;
    ResultSet myRs = null;

    try {
        // get a connection
        myConn = dataSource.getConnection();

        // create sql for validation
        String sqlValidate = "SELECT * FROM `rezerwacje_miejsc`"
                + " WHERE `NR_MIEJSCA`=?"
                + " AND (`START` BETWEEN ? AND ?"
                + " OR KONIEC` BETWEEN ? AND ?)";

        myStmt = myConn.prepareStatement(sqlValidate);

        myStmt.setInt(1, number);
        myStmt.setDate(2, new java.sql.Date(start.getTime()));
        myStmt.setDate(3, new java.sql.Date(end.getTime()));
        myStmt.setDate(4, new java.sql.Date(start.getTime()));
        myStmt.setDate(5, new java.sql.Date(end.getTime()));

        // execute query
        myRs = myStmt.executeQuery(sqlValidate);

        // check if there was a match
        result = myRs.next();
        return result;
    } finally {
        // close JDBC objects
        close(myConn, myStmt, myRs);
    }

1 Ответ

0 голосов
/ 06 июля 2018

Это неверно:

myRs = myStmt.executeQuery(sqlValidate);

Это должно быть просто:

myRs = myStmt.executeQuery();

Версия executeQuery, принимающая строку, является удержанием от Statement (проблема разработки API). Вы хотите один без параметров, который предоставлен PreparedStatement.


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

...