JDBC возвращает пустой набор результатов - PullRequest
16 голосов
/ 03 декабря 2010

Я использую JDBC для очень простого подключения к базе данных.

Я создал свое соединение / оператор и выполнил запрос.Я проверяю объект запроса оператора в отладчике, чтобы убедиться, что он отправляет правильный запрос.Затем я дважды проверил запрос (скопированный прямо из отладчика) в базе данных, чтобы убедиться, что он возвращает данные.Однако возвращенный набор результатов дает false для .next ()

Есть ли здесь какие-либо распространенные ловушки, которые мне не хватает?

public List<InterestGroup> getGroups() {
    myDB.sendQuery("select distinct group_name From group_members where
            username='" + this.username + "'");
    ResultSet results = myDB.getResults();
    List<InterestGroup> returnList = new ArrayList<InterestGroup>();
    try {
        while (results.next()) {
            returnList.add(new InterestGroup(results.getString("group_name"), myDB));
        } 
        return returnList;
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }

}

И класс myDB (простая оболочка, которая позволяет мнеперетащите код соединения / оператора в любой проект)

public void sendQuery(String query){
    this.query = query;
    try {
        if(statement == null){
            statement = connection.createStatement();
        }
        results = statement.executeQuery(query);
    } catch (SQLException e) {
        System.out.println(query);
        currentError = e;
        results = null;
        printError(e, "querying");
    }

}

public ResultSet getResults(){
    return results;
}

РЕДАКТИРОВАТЬ: Основываясь на предложениях, я в основном обновил свой код, но все еще остается та же проблема.Ниже приведен упрощенный фрагмент кода, в котором возникла та же проблема.

private boolean attemptLogin(String uName, String pWord) {

    ResultSet results;
    try{
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        connection =DriverManager.getConnection(connectionString,user,password);
        PreparedStatement statement = connection.prepareStatement("select username from users where username='testuser'");
        results = statement.executeQuery();
        if(results != null && results.next()){
            System.out.println("found a result");
            statement.close();
            return true;
        }
        System.out.println("did not find a result");
        statement.close();
        return false;
    }catch(SQLException e){
        e.printStackTrace();
        return false;
    }

}

На данный момент я также жестко закодировал существующий запрос, чтобы устранить этот источник ошибки.Та же проблема, что и раньше (это происходит со всеми запросами).Отладчик показывает, что все объекты создаются, а следы стека не печатаются.Кроме того, я могу использовать тот же код (и более сложный код, указанный выше) в другом проекте.

Ответы [ 14 ]

1 голос
/ 03 декабря 2010

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

0 голосов
/ 05 августа 2017

resultSet возвращает false, даже если вы должны получить значения строк для запроса, а rs.next () возвращает false, потому что вы, возможно, не написали commit; на своем терминале sql для запроса.После этого вы получите rs.next () как True.

0 голосов
/ 08 апреля 2015

Для меня проблема заключалась в том, что при создании столбца первичного ключа у меня не было NULL ENABLE. Как в ...

CREATE TABLE SYSTEM_SETTINGS  ( 
  SYSTEM_SETTING_ID NUMBER(9,0) NOT NULL ENABLE, 
    "KEY" VARCHAR2(50 BYTE), 
    "VALUE" VARCHAR2(128 BYTE),
     CONSTRAINT "PK_SYSTEM_SETTINGS" PRIMARY KEY (SYSTEM_SETTING_ID)) 
TABLESPACE USERS;

Когда я воссоздаю таблицу без нее, как в

CREATE TABLE SYSTEM_SETTINGS  ( 
  SYSTEM_SETTING_ID NUMBER(9,0), 
    "KEY" VARCHAR2(50 BYTE), 
    "VALUE" VARCHAR2(128 BYTE),
     CONSTRAINT "PK_SYSTEM_SETTINGS" PRIMARY KEY (SYSTEM_SETTING_ID)) 
TABLESPACE USERS;

Это начало работать через JDBC. Я использую ojdbc6.jar для драйвера jdbc.

0 голосов
/ 07 августа 2014

в моем случае запрос, который работал в sql developer, не работал в JAVA.

*select * from table where process_date like '2014-08-06%'* (worked in sql developer)

форматирование process_date для char помогло заставить его работать в JAVA

*select * from table where to_char(process_date) = '06-AUG-14'*
...