Guten Tag
Ich brüte jetzt schon eine ganze Weile über einen kleinen Fehler in meinem Code.
Wenn ich den Code so ausführe, bekomme ich eine Fehlermeldung
.
Kommentiere ich die Zeile 51 in der Methode executeSQL - statement.close() - aus, läuft es prima.
Für mich ist das nicht logisch denn ich brauche ja das Statement nicht mehr wenn das Resultat im ResultSet gespeichert ist.
Zusätzlich hatte ich vorher die gleiche Klasse mit HSQLDB anstatt mit UCANACCESS so am laufen, und da war es kein Problem.
Ich frage mich:
a) wieso das statement nicht geschlossen werden darf ?
b) was passiert wenn ich es einfach nicht schliesse? erledigt das der Garbage Collector?
Ich brüte jetzt schon eine ganze Weile über einen kleinen Fehler in meinem Code.
Wenn ich den Code so ausführe, bekomme ich eine Fehlermeldung
Java:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 statement is closed
Kommentiere ich die Zeile 51 in der Methode executeSQL - statement.close() - aus, läuft es prima.
Für mich ist das nicht logisch denn ich brauche ja das Statement nicht mehr wenn das Resultat im ResultSet gespeichert ist.
Zusätzlich hatte ich vorher die gleiche Klasse mit HSQLDB anstatt mit UCANACCESS so am laufen, und da war es kein Problem.
Ich frage mich:
a) wieso das statement nicht geschlossen werden darf ?
b) was passiert wenn ich es einfach nicht schliesse? erledigt das der Garbage Collector?
Java:
import java.sql.*;
// <dependency>
// <groupId>net.sf.ucanaccess</groupId>
// <artifactId>ucanaccess</artifactId>
// <version>4.0.4</version>
// </dependency>
public class Accdb {
private Connection con;
private String path;
private String user;
private String password;
private String tableName;
// Konstruktor
Accdb(String path, String user, String password, String tableName) {
this.path = path;
this.user = user;
this.password = password;
this.tableName = tableName;
try{
con = DriverManager.getConnection("jdbc:ucanaccess://" + path, user, password);
}catch(SQLException se){
se.printStackTrace();
}
}
// Schliessen der Connection
public void closeConnection() {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// Ausführen des Query
public ResultSet executeSQL(String sql) {
Statement statement=null;
ResultSet res=null;
try {
statement = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
res = statement.executeQuery(sql);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
return res;
}
// Lesen aller Einträge der DB und Ausgabe über die Konsole
public void readDB() {
try {
ResultSet res = executeSQL("SELECT * FROM " + tableName);
if (res.next()) {
// res.last();
// System.out.println("Total rows is : " + res.getRow() + "\n");
//
// res.beforeFirst();
int columnCount = res.getMetaData().getColumnCount();
int rowNumber=1;
while (res.next()) {
System.out.print(rowNumber + ": ");
for (int i = 1;i<=columnCount;i++ ) {
if (i!=columnCount) {
System.out.print(res.getString(i) + ", ");
} else System.out.print(res.getString(i));
}
System.out.println();
rowNumber++;
}
} else {
System.out.println("No Data");
}
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Accdb accdb = new Accdb("H:\\Database.accdb", "","","Data");
System.out.println("DB is open.");
System.out.println("------------------------------------------------------------------------------------------------");
accdb.readDB();
accdb.closeConnection();
System.out.println("------------------------------------------------------------------------------------------------");
System.out.println("DB has been closed !");
}
}