H2 数据库,从表中获取数据时出现问题
H2 Database, problems getting data from tables
我正在创建一个 JavaFX 应用程序,我已经正常连接到数据库。但是,当我希望从 tables 获取数据时,出现错误
org.h2.jdbc.JdbcSQLException: Table "LECTURE" not found; SQL
statement: SELECT NAME FROM Lecture [42102-192]
而且我 100% 确定我已连接到数据库并且 table 肯定存在,关于为什么会这样有什么建议吗?
听到的是我的连接代码和我正在 运行ning 的代码,您可以看到
public class ConnectionFactory {
//static reference to itself
private static ConnectionFactory instance = new ConnectionFactory();
public static final String URL = "jdbc:h2:file:~/db\.";
public static final String USER = "notepad";
public static final String PASSWORD = "password";
public static final String DRIVER_CLASS = "org.h2.Driver";
//private constructor
private ConnectionFactory() {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private Connection createConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
System.out.println("ERROR: Unable to Connect to Database.");
}
return connection;
}
public static Connection getConnection() {
return instance.createConnection();
}
}
查询是 运行
private void onLoadYearSelect() {
try {
Connection con = ConnectionFactory.getConnection();
Statement stat = con.createStatement();
String query = "SELECT NAME FROM Lecture";
ResultSet years = stat.executeQuery(query);
while(years.next()){
yearSelect.setValue(years.getString("NAME"));
System.out.println(years.getString("NAME"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void initialize(){
onLoadYearSelect();
}
如果它说table不存在,那么它真的不存在。
很可能,您实际上没有连接到正确的数据库。事实上,默认情况下,如果连接字符串指向一个不存在的数据库,它只会即时创建一个空数据库,这可以解释你的错误。
现在可能为时已晚(因为可能已经在某处创建了第二个数据库),但为了避免这种混淆,在连接字符串中包含 IFEXISTS=TRUE
是个不错的主意,这样它会在以下情况下失败数据库不存在,而不是创建一个空数据库来掩盖真正的问题。
public static final String URL = "jdbc:h2:file:~/db\.;IFEXISTS=TRUE";
但是,您仍然可以尝试调试问题的一件事是将 IFEXISTS=TRUE
添加到连接字符串。然后移动或重命名您认为它应该连接的数据库,以使连接字符串无效。基本上,强制它失败。如果代码仍然成功连接到数据库,那么您就会知道连接字符串没有指向您认为的位置。
我正在创建一个 JavaFX 应用程序,我已经正常连接到数据库。但是,当我希望从 tables 获取数据时,出现错误
org.h2.jdbc.JdbcSQLException: Table "LECTURE" not found; SQL statement: SELECT NAME FROM Lecture [42102-192]
而且我 100% 确定我已连接到数据库并且 table 肯定存在,关于为什么会这样有什么建议吗?
听到的是我的连接代码和我正在 运行ning 的代码,您可以看到
public class ConnectionFactory {
//static reference to itself
private static ConnectionFactory instance = new ConnectionFactory();
public static final String URL = "jdbc:h2:file:~/db\.";
public static final String USER = "notepad";
public static final String PASSWORD = "password";
public static final String DRIVER_CLASS = "org.h2.Driver";
//private constructor
private ConnectionFactory() {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private Connection createConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
System.out.println("ERROR: Unable to Connect to Database.");
}
return connection;
}
public static Connection getConnection() {
return instance.createConnection();
}
}
查询是 运行
private void onLoadYearSelect() {
try {
Connection con = ConnectionFactory.getConnection();
Statement stat = con.createStatement();
String query = "SELECT NAME FROM Lecture";
ResultSet years = stat.executeQuery(query);
while(years.next()){
yearSelect.setValue(years.getString("NAME"));
System.out.println(years.getString("NAME"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void initialize(){
onLoadYearSelect();
}
如果它说table不存在,那么它真的不存在。
很可能,您实际上没有连接到正确的数据库。事实上,默认情况下,如果连接字符串指向一个不存在的数据库,它只会即时创建一个空数据库,这可以解释你的错误。
现在可能为时已晚(因为可能已经在某处创建了第二个数据库),但为了避免这种混淆,在连接字符串中包含 IFEXISTS=TRUE
是个不错的主意,这样它会在以下情况下失败数据库不存在,而不是创建一个空数据库来掩盖真正的问题。
public static final String URL = "jdbc:h2:file:~/db\.;IFEXISTS=TRUE";
但是,您仍然可以尝试调试问题的一件事是将 IFEXISTS=TRUE
添加到连接字符串。然后移动或重命名您认为它应该连接的数据库,以使连接字符串无效。基本上,强制它失败。如果代码仍然成功连接到数据库,那么您就会知道连接字符串没有指向您认为的位置。