web-dev-qa-db-fra.com

Comment corriger: Erreur de la base de données H2 intégrée "NonTransientError: impossible de lire la page à la position"?

Je crée un programme JavaFX avec une base de données H2 intégrée qui sera utilisée pour gérer les connexions et les mots de passe des utilisateurs. En utilisant Intellij Ultimate, j'ai une base de données que je peux exécuter à partir de la barre d'outils. De plus, je suis presque certain d'avoir le bon pilote JDBC et l'URL. La base de données fonctionne correctement à partir de la console de base de données d'Intellij. L'erreur se produit lorsque j'essaie d'accéder à la base de données avec Java. J'utilise une classe de base de données pour gérer ma connexion à la base de données.

Je reçois un JdbcSQLNonTransientException, erreur générale:

Exception d'état illégal: impossible de lire la page en position

Causé par: Java.lang.IllegalStateException: type 17 non pris en charge.

La ligne de code qui s'affiche dans mon compilateur, provoquant l'erreur: Connection conn = DriverManager.getConnection(DB_URL, "sa", "");

J'ai essayé de trouver un problème similaire partout mais je ne trouve pas de problèmes connexes. J'ai essayé de simplifier ma classe autant que possible pour isoler le problème et simplement établir une connexion. J'ai supprimé mon projet et essayé de recommencer à zéro.

Classe DatabaseManager simplifiée qui génère le problème:

public class DatabaseManager {
    static final String JDBC_DRIVER = "org.h2.Driver";
    static final String DB_URL = "jdbc:h2:D:/trant/Documents/Java Practice/Order A Car2/res/userDatabase";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        Connection conn = DriverManager.getConnection(DB_URL, "sa", "");
        Statement st = conn.createStatement();
        st.executeUpdate("SELECT * FROM JOBS");
        conn.close();
    }
}

Je m'attends à me connecter à une base de données H2 et à récupérer les données de la table "JOBS". Le code ne se compile pas avec les erreurs ci-dessus.

edit: Si j'utilise la version 1.4.199 de H2 plutôt que 1.4.200, le problème disparaît. J'ai trouvé un problème presque identique ici: https://github.com/h2database/h2database/issues/2078 . Ce lien a une trace de pile identique à la mienne. Je n'ai pas encore résolu le problème avec la version 1.4.200

5
Suede

Vous devriez vraiment fournir une trace de pile complète et pas seulement le message d'erreur dans ces questions.

Et le message que vous voyez n'est pas une erreur de compilation.

Généralement, ce message signifie que votre base de données est corrompue. Si vous n'en avez pas besoin, vous pouvez simplement supprimer tous ses fichiers et les recréer à partir de zéro.

Si vous pouvez ouvrir la base de données à partir d'un outil, mais ne pouvez pas l'ouvrir à partir de votre application, vérifiez les versions de H2 qui sont utilisées aux deux endroits et alignez-les. Vous pouvez exporter la base de données dans une version qui fonctionne vers un script SQL avec SCRIPT TO 'filename.sql' commande et utilisez ce script pour remplir les données dans une nouvelle base de données pour vous assurer qu'elles ne sont pas endommagées (avec la version que vous préférez).

0
Evgenij Ryazanov

Comme déjà noté par @Yura, vous devez vous assurer que toute votre base de code et tous vos outils utilisent la même version du pilote, que ce soit 1.4.196 ou 1.4.200.

Ensuite, s'il n'y avait rien de valable dans votre base de données, vous pouvez déposer le fichier db en toute sécurité et il sera recréé à nouveau.

Si vous aviez des données précieuses et que vous n'avez pas de sauvegarde, la réparation de la base de données peut devenir une quête, pas nécessairement réussie ...

Et si vous avez une sauvegarde, alors une procédure de "sauvegarde vers SQL à l'aide de 196" et de "restauration à partir de SQL à l'aide de 200" est plus susceptible de faire le travail pour vous, voir http : //www.h2database.com/html/tutorial.html#upgrade_backup_restore ...

0
Sergey Ushakov