使用SQLite java驱动程序3.21.0进行简单选择不返回数据

时间:2018-05-10 14:07:42

标签: java sqlite jdbc

我在MacOS上使用SQLite和java发出一个非常简单的选择时遇到了问题。

这是我的代码:

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(当前版本)
  3. 使用类似的代码我可以创建表并在DB中插入行,因此环境的设置应该没问题(在编译和运行时,Properties => Libraries =>)。

    我也在Eclipse上尝试过相同的负面结果。我也尝试了我发现的所有后向JDBC驱动程序版本,同样的情况。我正在使用DB Browser 3.10.1的数据库浏览器,我可以读取我正在寻找的数据。

    我在Mac上安装了SQLite,我可以使用命令行命令读取数据。

    看起来像是司机故障,除非我遗漏了一些非常重要的东西。

2 个答案:

答案 0 :(得分:0)

关闭连接后无法访问结果集。请参阅Java - Can't use ResultSet after connection close

在使用完resultSet后调用close()。

    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();

答案 1 :(得分:0)

在处理结果集之前关闭连接和语句。这是不可能的(当你使用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,因为它会简化你的代码并防止这样的错误,因为像结果集这样的资源将仅限于其父对象的范围。在try-with-resources结束时,Java将自动调用close()方法。

我建议您阅读有关JDBC的教程并检查其Javadoc以获取有关如何使用JDBC API的更多信息。