Простой выбор с использованием SQLite Java-драйвер 3.21.0 не возвращает данные - PullRequest
0 голосов
/ 10 мая 2018

Я столкнулся с проблемой выдачи очень простого выбора с использованием SQLite и java в MacOS.

вот мой код:

public class TestJDBC1 
{

public static Connection connect_DB() throws ClassNotFoundException {
    Class.forName("org.sqlite.JDBC");
    Connection conn = null;
    try {
        // db parameters
        String url = "jdbc:sqlite:/Users/Shared/DB_Farmaci/oracle-sample.db";
        // create a connection to the database
        conn = java.sql.DriverManager.getConnection(url);

        System.out.println("Connection a SQLite stabilita.");

    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    return conn;
}

public static void main( String[] args ) throws ClassNotFoundException, InterruptedException, SQLException
{
    Connection conn = connect_DB();
    try 
    {
      conn.setAutoCommit(false);
    } catch (SQLException ex) {
        Logger.getLogger(TestJDBC1.class.getName()).log(Level.SEVERE, null, ex);
    }

    try 
    {
        Statement S = null ;
        ResultSet rs = null ;
        S = conn.createStatement();

        String queryS = "select deptno, dname, loc from dept ;" ;
        rs = S.executeQuery(queryS);

        S.close();
        conn.close();

        int x = 0;
        while (rs.next()) 
        {
          x++;
          System.out.println(rs.getInt("deptno") +  "\t" + 
                             rs.getString("dname") + "\t" +
                             rs.getDouble("loc"));
        }
        if (x > 0) 
        {
            System.out.println("# rows returned => " + x);
        } else 
        {
            System.out.println("no rows returned");
        }
    } catch (SQLException se) {
        System.out.println(se);
        System.out.println("errore DB");
    }
}    

Как видите, это действительно просто, но не возвращает никаких данных.

Моя среда выглядит следующим образом:

  1. NetBeans 8,2
  2. sqlite-jdbc-3.21.0.jar (текущая версия)

Используя подобный код, я могу создавать таблицы и вставлять строки в БД, поэтому настройка среды должна быть в порядке (Свойства => Библиотеки => как при компиляции, так и при запуске).

Я также попробовал Eclipse, с тем же отрицательным результатом. Я также попробовал все обратные версии драйверов JDBC, которые я нашел, та же самая ситуация. Я использую DB Browser для SQLite 3.10.1 и могу читать данные, которые ищу.

У меня установлен Macite на моем Mac, и я могу читать данные с помощью команд командной строки.

Это похоже на неисправность драйвера, если я не пропустил что-то очень важное.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы закрываете соединение и оператор перед обработкой результирующего набора.Это невозможно (и должно было привести к SQLException, когда вы использовали rs.next(), который вы не публиковали).

Вам нужно изменить код на что-то вроде:

try (Connection conn = connect_DB()) {
    // other actions with connection

    String queryS = "select deptno, dname, loc from dept ;" ;
    try (Statement statement = conn.createStatement();
         ResultSet rs = statement.executeQuery(queryS)) {

        int x = 0;
        while (rs.next())  {
            x++;
            // etc
        }

    } catch (SQLException se) {
        se.printStackTrace()
        System.out.println("errore DB");
    }
}

Я использовал try-with-resources здесь, так как это упростит ваш код и предотвратит подобные ошибки, потому что ресурсы, такие как набор результатов, будут ограничены областью действия своего родительского объекта.В конце попытки с ресурсами Java автоматически вызовет метод close().

Я предлагаю вам прочитать руководство по JDBC и проверить его Javadoc, чтобы получить больше информации о том, как использовать API JDBC..

0 голосов
/ 10 мая 2018

вы не можете получить доступ к вашему набору результатов после закрытия соединения.см. Java - Невозможно использовать ResultSet после закрытия соединения .

вызывать функцию close () после того, как вы закончили использовать resultSet.

    String queryS = "select deptno, dname, loc from dept ;" ;
    rs = S.executeQuery(queryS);

    //remove your close from here.

    int x = 0;
    while (rs.next()) 
    {
      x++;
      System.out.println(rs.getInt("deptno") +  "\t" + 
                         rs.getString("dname") + "\t" +
                         rs.getDouble("loc"));
    }
    if (x > 0) 
    {
        System.out.println("# rows returned => " + x);
    } else 
    {
        System.out.println("no rows returned");
    }


    //move your close here
    S.close();
    conn.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...