SQLite:ResultSet游标已位于stmt.executeQuery()之后的末尾
我正在使用命令SQLite:ResultSet游标已位于stmt.executeQuery()之后的末尾,sqlite,cursor,resultset,Sqlite,Cursor,Resultset,我正在使用命令allCustomers=stmt.executeQuery(“SELECT*fromcustomers”)从SQLite数据库读取结果集 表customers有3列:customerID,firstname,lastname 其中customerID是0到199之间的整数 在我的代码中做了一些其他的事情之后,我来到这行: if(alleKunden.next()){ System.out.println( allCustomers.getInt(1) + " " + al
allCustomers=stmt.executeQuery(“SELECT*fromcustomers”)从SQLite数据库读取结果集代码>
表customers
有3列:customerID
,firstname
,lastname
其中customerID是0到199之间的整数
在我的代码中做了一些其他的事情之后,我来到这行:
if(alleKunden.next()){
System.out.println( allCustomers.getInt(1) + " " + allCustomers.getString(2));
}
在这一行中,我得到一个列2越界[1,1]
错误。如果我掉下去
allCustomers.getString(2)
输出将为200
,在下一次迭代中(在for循环中发生时),异常ResultSet closed
终止程序
我用firefox插件SQLite检查了数据库,发现数据库正确地包含了所有客户信息
那么,为什么我的结果集中没有第二列,为什么我的allCustomers.getInt(1)的结果是“200”
这是我的全部代码:
(注意:由于某些原因,在第一个任务createCustomers()
)中,完全相同的东西可以正常工作)
package电话簿;
导入java.sql.Connection;
导入java.sql.Date;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Statement;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
类SqlDB{
私有静态最终SqlDB dbcontroller=newsqldb(Application.VERBOSE_模式、Application.CREATE_新数据、Application.FAKTOR、Application.DB_路径);
专用静态连接;
私有静态最终字符串DB_PATH=System.getProperty(“user.home”)+“/”+“tmp/telefonbook.sqlite”;
静态布尔详细模式;
静态布尔数据;
静态输入faktor;
静态字符串路径;
静止的{
试一试{
Class.forName(“org.sqlite.JDBC”);
}catch(classnotfounde异常){
System.err.println(“JDBC驱动程序错误”);
e、 printStackTrace();
}
}
公共SqlDB(布尔verboseMode、布尔createNewData、int faktor、字符串dbPath){
this.verboseMode=verboseMode;
this.createNewData=createNewData;
this.faktor=faktor;
this.dbPath=dbPath;
}
公共静态SqlDB getInstance(){
返回控制器;
}
私有void initDBConnection(){
试一试{
if(连接!=null)
返回;
System.out.println(“创建到数据库的连接…”);
connection=DriverManager.getConnection(“jdbc:sqlite:+DB_路径”);
如果(!connection.isClosed())
System.out.println(“…连接已建立”);
}捕获(SQLE异常){
抛出新的运行时异常(e);
}
Runtime.getRuntime().addShutdownHook(新线程(){
公开募捐{
试一试{
如果(!connection.isClosed()&&connection!=null){
connection.close();
if(connection.isClosed())
System.out.println(“与数据库的连接已关闭”);
}
}捕获(SQLE异常){
e、 printStackTrace();
}
}
});
}
私有void createCustomers(int customerAmount){
试一试{
System.out.print(“创建客户…\n”);
语句stmt=connection.createStatement();
stmt.executeUpdate(“如果存在客户,则删除表;”);
stmt.executeUpdate(“创建表customer(customerID、lastname、firstname);”;
字符串名;
字符串lastname;
对于(int i=0;ipackage telefonbook;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class SqlDB {
private static final SqlDB dbcontroller = new SqlDB(Application.VERBOSE_MODE, Application.CREATE_NEW_DATA, Application.FAKTOR, Application.DB_PATH);
private static Connection connection;
private static final String DB_PATH = System.getProperty("user.home") + "/" + "tmp/telefonbook.sqlite";
static boolean verboseMode;
static boolean createNewData;
static int faktor;
static String dbPath;
static {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
System.err.println("Error with the JDBC driver");
e.printStackTrace();
}
}
public SqlDB(boolean verboseMode, boolean createNewData, int faktor, String dbPath){
this.verboseMode = verboseMode;
this.createNewData = createNewData;
this.faktor = faktor;
this.dbPath = dbPath;
}
public static SqlDB getInstance(){
return dbcontroller;
}
private void initDBConnection() {
try {
if (connection != null)
return;
System.out.println("Creating Connection to Database...");
connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
if (!connection.isClosed())
System.out.println("...Connection established");
} catch (SQLException e) {
throw new RuntimeException(e);
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
if (!connection.isClosed() && connection != null) {
connection.close();
if (connection.isClosed())
System.out.println("Connection to Database closed");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
private void createCustomers(int customerAmount) {
try {
System.out.print("Creating customers...\n ");
Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS customer;");
stmt.executeUpdate("CREATE TABLE customer (customerID, lastname, firstname);");
String firstname;
String lastname;
for (int i = 0; i < customerAmount; i++){
//here a random name is generated. Gonna skip this code
firstname = randomname();
lastname = randomname();
stmt.execute("INSERT INTO customer (customerID, lastname, firstname) VALUES (" + i + ",'" + lastname + "','" + firstname + "')");
}
connection.commit();
if(verboseMode){
ResultSet allCustomers = stmt.executeQuery("SELECT * FROM customer");
while(allCustomers.next()){
System.out.println(allCustomers.getString(1) + "\t" + allCustomers.getString(2) + "\t" +allCustomers.getString(3));
}
}
} catch (SQLException e) {
System.err.println("Couldn't handle DB-Query");
e.printStackTrace();
}
}
private void createTelefone(int telefonAmount) {
try {
String telefonnumber;
System.out.print("Creating telefones...\n ");
Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS telefone;");
stmt.execute("CREATE TABLE telefone (telefonID, telefonnumber, ownerID);");
ResultSet allCustomers = stmt.executeQuery("SELECT * FROM customer");
int customerAmount = stmt.executeQuery("SELECT COUNT(*) FROM customer").getInt(1);
for (int i = 0; i < telefonAmount; i++){
telefonnumber = randomNumber();
if(allCustomers.next()){
// This line will fail!
System.out.println(allCustomers.getInt(1) + " " + allCustomers.getString(2));
stmt.execute("INSERT INTO telefone (telefonID, telefonnumber, ownerID) VALUES (" + i + ",'" + telefonnumber + "', " + allCustomers.getInt(1) + ")");
} else {
//do something else
}
}
ResultSet allTelefones = stmt.executeQuery("SELECT * FROM telefone");
if(verboseMode){
while(allTelefones.next()){
System.out.println(allTelefones.getString(1) + "\t" + allTelefones.getString(2) + "\t" +allTelefones.getString(3));
}
}
} catch (SQLException e) {
System.err.println("Couldn't handle DB-Query");
e.printStackTrace();
}
}
public static void Application() {
int customerAmount = 100*faktor;
int telefonAmount = 100*faktor;
SqlDB dbc = SqlDB.getInstance();
dbc.initDBConnection();
try{
connection.setAutoCommit(false);
if (createNewData){
dbc.createCustomers(customerAmount);
dbc.createTelefone(telefonAmount);
}
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
int customerAmount = stmt.executeQuery("SELECT COUNT(*) FROM customer").getInt(1);
stmt.execute("INSERT INTO telefone (telefonID, telefonnumber, ownerID) VALUES (" + i + ",'" + telefonnumber + "', " + allCustomers.getInt(1) + ")");
PreparedStatement prep = connection.prepareStatement("INSERT INTO telefone VALUES(?,?,?);");
prep.setInt(1, i); // telefonID
prep.setString(2, telefonnumber); // telefonnumber
prep.setInt(3, randomOwner); // ownerID
prep.addBatch();