Как правильно вернуть SQL Datetime обратно в Java-приложение? - PullRequest
2 голосов
/ 16 марта 2011

У меня проблемы с получением запросов из базы данных SQL. Я могу получить взорванные вещи , добавленные в базу данных, но у меня непомерное количество трудностей при выполнении обратного. Три вещи по порядку:

Сама таблица SQL:

CREATE TABLE patientInstructions (
    id          INT UNSIGNED AUTO_INCREMENT,
    lastUpdated datetime NOT NULL,
    PatientID          BIGINT UNSIGNED NOT NULL,
    HCPID              BIGINT UNSIGNED NOT NULL,
    OVid               BIGINT UNSIGNED NOT NULL,
    urlLink             VARCHAR(250) NOT NULL,
    linkInstructions    VARCHAR(500) NOT NULL,
    linkName            VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
) AUTO_INCREMENT=1 ENGINE=MyISAM;

Сбой вызова метода (я получаю -1L вместо фактического значения данных, хранящегося в базе данных, поэтому я знаю, что, во-первых, существует проблема):

public String getLastUpdated(long ovID) throws DBException {
        try {
            return psiDAO.getLastUpdated(ovID);
        } catch (myOwnException e) {
            e.printStackTrace();
            return "-1L";
        }
    }

И, наконец, сбой вызова метода:

public String getLastUpdated(long ovId) throws DBException {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = factory.getConnection();
            ps = conn.prepareStatement("SELECT * FROM patientInstructions"
                    + " WHERE ovId=?");
            ps.setLong(1, ovId);
            ResultSet rs = ps.executeQuery();
            java.util.Date updated = new java.util.Date();
            updated = rs.getTime("lastUpdated");
            return updated.toString();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DBException(e);
        } finally {
            DBUtil.closeConnection(conn, ps);
        }
    }

Какой объект Java соответствует SQL Datetime? Я пробовал rs.getTimestamp, rs.getDate и т. Д., Но больше не добился успеха (хотя я не исключаю, что я их тоже испортил). Я делаю ошибку, перенося данные из набора результатов обратно в объект Java?

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

Вы должны вызвать ResultSet.next () для ResultSet перед доступом к каждой строке, включая первую. Вы не делаете это здесь; сообщение об исключении должно фактически сообщать вам об этом.

1 голос
/ 16 марта 2011

Поскольку ваш тип данных datetime, вам нужно будет использовать getTimestamp() ... см. Дополнительную информацию о отображении типов данных .

Итак, ваш код должен выглядеть примерно так: -

...
ResultSet rs = ps.executeQuery();

String updated = "";

if (rs.next()) {
    updated = rs.getTimestamp("lastUpdated").toString();
}

rs.close();
ps.close();

return updated;
1 голос
/ 16 марта 2011

Существует три класса: java.sql.Date, java.sql.Time и java.sql.Timestamp.Я не уверен, какой из них наиболее близко соответствует DATETIME в SQL.Все три взяты из java.util.Date, поэтому вы можете присвоить результат вызова rs.getTime одному.

У меня нет здесь настройки, которая позволила бы мне его протестировать,но я бы попробовал использовать один из типов из java.sql. * и посмотреть, какие результаты это дает.

Упс! Я отправил свой ответ раньше Эрнеста и даже не заметилнедостающий rs.next ().Это определенно ваша проблема, и я уверен, что с этим изменением java.util.Date будет работать нормально.

0 голосов
/ 16 марта 2011

Пожалуйста, вставьте исключение здесь.Вам нужно вызвать следующий метод ResultSet перед извлечением значений из набора результатов.Кроме того, попробуйте java.sql.Timestamp lastUpdatedTimestamp = getTimestamp("lastUpdated") При необходимости вы можете преобразовать метку времени в строку позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...