我在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");
}
}
正如您所看到的那样,它非常简单,但它不会返回任何数据。
我的环境如下:
使用类似的代码我可以创建表并在DB中插入行,因此环境的设置应该没问题(在编译和运行时,Properties => Libraries =>)。
我也在Eclipse上尝试过相同的负面结果。我也尝试了我发现的所有后向JDBC驱动程序版本,同样的情况。我正在使用DB Browser 3.10.1的数据库浏览器,我可以读取我正在寻找的数据。
我在Mac上安装了SQLite,我可以使用命令行命令读取数据。
看起来像是司机故障,除非我遗漏了一些非常重要的东西。
答案 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的更多信息。