【问题标题】:Database connect, load data loop error数据库连接,加载数据循环错误
【发布时间】:2018-01-09 15:33:39
【问题描述】:

我目前有两个不同的 fxml 页面。一个是主屏幕,另一个处理连接。主屏幕当前正在创建初始化所需的数据库和表。另一个页面用于在数据库中添加和删除值。问题是我目前正在主页上运行一个函数,以在初始化时使用数据库数据填充选择框,但是当它运行时,它会尝试再次创建表并引发错误,因为表已经创建。有没有简单的方法来解决这个问题?

下面是主页面初始化函数:

public void initialize() {
        try {

            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
            //below gets the connection specified earlier
            conn = DriverManager.getConnection(dbURL);
            System.out.println("DB Connection Created!");

            String createString = "CREATE TABLE Connections (DETAILS VARCHAR(255) NOT NULL, NAME VARCHAR(255) UNIQUE)";
            stmt = conn.createStatement();
            stmt.execute(createString);
            System.out.println("Connections table created!");


            //below is for populating the usernames
            String sql2 = "Select NICKNAME FROM Users ORDER BY NICKNAME ASC";
            stmt = conn.createStatement();

            ResultSet rs2 = stmt.executeQuery(sql2);

            usernameList.clear();
            while(rs2.next()) {
                String name = rs2.getString("NICKNAME");
                usernameList.add(name);
                System.out.println("User initialize: " + name);
            }
            System.out.println("Objects: " + usernameList);
            sourceUsername.setItems(FXCollections.observableArrayList(usernameList));
            cbosUsername.setItems(FXCollections.observableArrayList(usernameList));
            tiUsername.setItems(FXCollections.observableArrayList(usernameList));
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

有人对解决这个问题的简单方法有意见吗?

【问题讨论】:

  • 所以你多次执行initialize()?为什么不将 create 语句移到其他地方,这样就不会执行两次?
  • 问题是我最初需要填充数据,如果没有创建表,则尝试从中选择数据并抛出错误
  • 我的意思是,您可以将代码移动到一个部分,该部分将在启动时仅执行一次,因此在进一步的代码中您可以假设正在创建表
  • 真正的问题是为什么initialize() 被多次调用。那不应该发生。您能否发布更多代码:阅读(并发布)堆栈跟踪以查看相关内容。
  • 不能只加载一次吗?保留对根节点和控制器的引用,只重新显示相同的节点而不是重新加载它。

标签: javafx combobox derby


【解决方案1】:

我认为最好的方法是将 CREATE-Statement 放在 Application-Start-Method 中:

public class MyApp extends Application {
    public void start(Stage stage) {
        //perform create statement
    }
}

或者简单地在你的 CREATE-Statement 中捕获所有异常:

try{
    String createString = "CREATE TABLE Connections (DETAILS VARCHAR(255) NOT NULL, NAME VARCHAR(255) UNIQUE)";
    stmt = conn.createStatement();
    stmt.execute(createString);
} catch (Exception e){
}

【讨论】:

  • 想过这样做,但它是一个嵌入式derby数据库,不支持“IF NOT EXISTS”SQL创建语句
  • 如何处理SELECT * FROM Connections 并捕获异常?如果你得到正确的异常,你可以调用 CREATE-Statement
  • 不要压制异常。如果出现其他问题(即意外),您将不知道或无法诊断它。将数据库创建移动到start(...) 方法可能是这里的方法。
  • 这就是为什么我对捕获异常犹豫不决的原因。无法保证这也是它们的原因。
  • @dgelinas21 您不需要吞下所有异常,您可以尝试捕获一个,它将在重复创建时抛出。您仍然可以以通常的方式处理其他异常。我只是不知道这里到底会抛出什么,所以我把所有的异常都作为一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2012-01-21
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多