jdbc со встроенным дерби в приложении javafx: таблица/представление «ИМЯ ТАБЛИЦЫ» не существует, исключение

Я создаю автономное приложение JavaFX и использую встроенную базу данных дерби и подключаюсь к ней через JDBC. Проблема в том, что всякий раз, когда я пытаюсь взаимодействовать с таблицами базы данных, я получаю «java.sql.SQLSyntaxErrorException: таблица/представление« ЗДАНИЯ »не существует».

Я много искал, но не могу решить. Я просмотрел эти три причины, в которых упоминалось здесь, но я все еще получаю ту же ошибку. Этот пост звучит очень похоже на мой случай, но я не могу понять, как он его разрешил. Я проверил URL-адрес базы данных из метаданных соединения и на вкладке служб netbeans, и это то же самое.

Вот фрагменты кода, связанные с проблемой:

public class DataBaseUtility {

public Connection derbyDBConnection(String url){
    Connection con = null;

    String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    try {
        Class.forName(driver).newInstance();
        con = DriverManager.getConnection(url, "", "");
        con.setSchema("APP");
    } catch (ClassNotFoundException | SQLException | 
            InstantiationException | IllegalAccessException ex) {
        Logger.getLogger(DataBaseUtility.class.getName())
                .log(Level.SEVERE, null, ex);
    }
    return con;
}

public ResultSet databaseQuerying(Connection con, String query){

    ResultSet resultSet = null;
    try {
        PreparedStatement preStmt = con.prepareStatement(query);
        resultSet = preStmt.executeQuery();
    } catch (SQLException ex) {
        Logger.getLogger(DataBaseUtility.class.getName()).log(Level.SEVERE, null, ex);
    }
    return resultSet;
}}

а также

public class MainApp extends Application {

public static DataBaseUtility dbUtility ;
public static Connection con;

@Override
public void init(){
    dbUtility = new DataBaseUtility();
    con = dbUtility.derbyDBConnection("jdbc:derby:elsarhEmbedded");
    try {
        DatabaseMetaData dbmd = con.getMetaData();
        System.out.println("\n----------------------------------------------------") ;
        System.out.println("Database Name     = " + dbmd.getDatabaseProductName()) ;
        System.out.println("Database User Name= " + dbmd.getUserName()) ;
        System.out.println("Database Version  = " + dbmd.getDatabaseProductVersion()) ;
        System.out.println("Driver Name       = " + dbmd.getDriverName()) ;
        System.out.println("Driver Version    = " + dbmd.getDriverVersion()) ;
        System.out.println("Database URL      = " + dbmd.getURL()) ;
        System.out.println("----------------------------------------------------") ;

 /*
    -------------the result from the above ----------
    Database Name     = Apache Derby
    Database User Name= APP
    Database Version  = 10.14.1.0 - (1808820)
    Driver Name       = Apache Derby Embedded JDBC Driver
    Driver Version    = 10.14.1.0 - (1808820)
    Database URL      = jdbc:derby:elsarhEmbedded
    */

    } catch (SQLException ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Я попытался выполнить команду для базы данных из netbeans и вставить данные в ту же таблицу, и она работает.


person Khalifa Gad    schedule 31.03.2018    source источник
comment
URL-адрес jdbc:derby:elsarhEmbedded является относительным URL-адресом, возможно, вы подключаетесь к базе данных, отличной от NetBeans. База данных, используемая вашим приложением, вероятно, пуста и не содержит таблиц.   -  person Mark Rotteveel    schedule 31.03.2018
comment
@MarkRotteveel я вижу, что это задокументировано там (db.apache.org/ derby/docs/10.0/manuals/develop/develop15.html) так, но если это не так, что мне делать? это хорошая идея установить абсолютный путь?   -  person Khalifa Gad    schedule 31.03.2018
comment
я не добавил 'create=true;' к URL-адресу, чтобы создать другой, если он не существует.   -  person Khalifa Gad    schedule 31.03.2018


Ответы (1)


Как сказал @Mark Rotteveel, все дело в относительных путях и каталогах, и это хорошо объяснено в ответе @BlueRat на этот вопрос

person Khalifa Gad    schedule 31.03.2018