3

我正在编写一个使用本地 SQL 数据库存储数据的程序。

我正在使用此处找到的驱动程序:https ://bitbucket.org/xerial/sqlite-jdbc

我正在尝试从数据库中读取并将 tableName 的内容放入 JTable 中,如下所示:

public Object[][] getTable(String tableName){
    int columns = getColumnNumber(tableName);
    int rows = getRowNumber(tableName);
    String[] columnNames = getColumnNames(tableName);
    Object[][] table = new Object[rows][columns];
    try{
        Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("select * from " + tableName);
        for(int r = 0; r < rows; r++){
            rs.next();
            for (int c = 0; c < columns; c++){
                table[r][c] = rs.getString(columnNames[c]);
            }
        }
        return table;           
    }catch(Exception e){
        System.out.println("ERROR CREATING TABLE ARRAY");
        e.printStackTrace();
        return null;
    }
}

然后稍后我尝试返回并在表中添加一行:

public boolean addRow(String tableName, Object[] values){
    if(!isDataAcceptable(tableName, values))
        return false;
    try{
        String stmt = "insert into " + tableName + " values (";
        for(int c = 0; c < values.length; c++){
            if(values[c] instanceof String)
                stmt += "'" + values[c] + "'";
            else
                stmt += values[c];
            if(c == (values.length - 1))
                    stmt += ");";
            else
                stmt += ", ";
        }
        System.out.println(stmt);
        Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
        Statement statement = connection.createStatement();
        statement.executeUpdate(stmt);
        return true;
    }catch(Exception e){
        System.out.println("ERROR INSERTING ROW");
        e.printStackTrace();
        return false;
    }
}

然后我想用新行更新我之前创建的 JTable。

当我尝试添加该行时,它会导致异常:

java.sql.SQLException: database is locked

指向这条线:

statement.executeUpdate(stmt);

...在 addRow() 方法中。

为什么数据库被锁定,我如何解锁它以写入它?

4

1 回答 1

4

为什么数据库被锁定,我如何解锁它以写入它?

数据库很可能被锁定,addRow因为之前的调用getTable没有关闭结果集。该代码也无法关闭数据库连接对象,这将导致资源泄漏。

close()基本的解决方法是调用rsandconnection对象,但您需要以正确的方式来使您的代码可靠。

这是在 Java 7 中使用“try with resources”语法的推荐方法:

try (Connection connection = 
         DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db"),
     Statement stmt = connection.createStatement(),
     ResultSet rs = stmt.executeQuery("select * from " + tableName)) {
  for (int r = 0; r < rows; r++) {
    rs.next();
    for (int c = 0; c < columns; c++) {
      table[r][c] = rs.getString(columnNames[c]);
    }
  }
  return table;           
} catch (Exception e) {
    System.out.println("ERROR CREATING TABLE ARRAY");
    e.printStackTrace();
    return null;
}

您也可以通过close在块中显式调用来做到这一点finally,但它更冗长,如果您有需要关闭的相关资源,则代码可能难以正确......就像这里一样。

于 2013-03-23T23:40:13.393 回答