IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[EF][C#] Pas d'exception sur ouverture de base


Sujet :

Accès aux données

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut [EF][C#] Pas d'exception sur ouverture de base
    Bonjour,
    --------

    J'ai ce code, destiné à connecter mon modèle sur une base en sqlite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
            public static BaseEntities OuvrirDataBase(string FileName)
            {
                BaseEntities result;
                try
                {
                    // Créer un constructeur automatique de chaîne de connexion
                    EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
     
                    // Indique le serveur de bdd utilisé (SQLite = API ne nécessitant pas de serveur)
                    ecsb.Provider = "System.Data.SQLite";
     
                    // Indiquer les chemins d'accès au modèle (copié depuis app.config)
                    ecsb.Metadata = "res://*/Modele.csdl|res://*/Modele.ssdl|res://*/Modele.msl";
     
                    // Donner le nom du provider
                    ecsb.ProviderConnectionString = string.Format("data source={0}", FileName);
     
                    // ouvrir la base en utilisant la chaîne de connexion construite
                    result = new BaseEntities(ecsb.ConnectionString);
     
                }
                catch (Exception)               // Echec de l'opération
                {
                    MessageBox.Show("Impossible d'ouvrir le facturier\n" + FileName);
                    result = null;              // échec de la tentative
                }
     
                // Retourne la base ou null
                return result;
    Ca fonctionne, mais le problème est que même si le fichier "FileName" n'existe pas, je n'ai pas d'exception, et donc je n'ai jamais le message d'erreur.

    Comment puis-je vérifier cette validité, sachant que si la base existe, mais est vide, je ne dois pas avoir d'erreur?

    Merci
    Claude

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu peux tester l'existence du fichier avec System.IO.File.Exists(path)
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    C'est SQLite qui fonctionne comme ça... la méthode pour créer une BDD est la même que pour en ouvrir une existante. Si le fichier n'existe pas, il est créé. Donc pas d'erreur... Comme l'a dit SaumonAgile, vérifie l'existence du fichier avec File.Exists. Si tu veux aussi vérifier que les tables existent (que ce n'est pas juste un fichier vide), tu peux faire un SELECT sur la table sqlite_master, qui liste les tables et vues de la base

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut

    En fait, avec cette routine le fichier n'est pas créé, c'est du linq to entities : j'avais vérifié, il ne crée rien et pourtant ne retourne aucune erreur.

    Le fichier, je le crée à plus bas niveau avec new SQLiteConnection(ChaineConnexion), qui soit établit la connexion, soit crée le fichier, ce qui me permet ensuite de créer les différentes tables, toujours en bas niveau, connexion que je ferme ensuite pour la réouvrir via Entities.

    Une fois le début de mon programme lancé une fois (avec la routine de création), je dispose d'une table "d'essai" qui me permet alors de créer automatiquement mon modèle, et ensuite je peux continuer le développement et exploiter avec Linq to entities, comme vous me l'aviez recommandé
    Ca m'évite d'utiliser un manager, et ça permet de créer la base via le programme directement.

    Pour ma question, si je teste avec File.Exists, je ne sais pas déterminer si ce fichier est bien une bdd valide correspondant avec mon modèle, c'est ça que je voulais tester.

    Merci pour l'info de la table cachée, mais si j'ai bien compris, ça m'oblige à refaire des requêtes SQL en bas niveau.

    J'ai trouvé une astuce qui me permet de tester en restant en linq to entities : lors de la création des tables de ma base, j'en ajoute une qui ne contient qu'un seul champs : le numéro de version de la base.
    Ensuite, toujours en étape de création, j'ajoute un unique record avec le numéro de version demandé par la version actuelle du programme.

    Comme ça, si le fichier n'est pas au bon format, j'ai une exception en tentant de lire le record sur la table "version".
    Et si c'est apparemment le bon format, je peux vérifier la valeur contenue, ce qui me permet de vérifier que la version de la table correspond bien à la version attendue.

    Ca fonctionne, mais j'ignore si c'est le plus élégant

    En tout cas, Merci

    Claude

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ClaudeBg Voir le message
    En fait, avec cette routine le fichier n'est pas créé, c'est du linq to entities : j'avais vérifié, il ne crée rien et pourtant ne retourne aucune erreur.
    En fait, le constructeur de ton ObjectContext n'essaie pas tout de suite d'ouvrir la connexion à la BDD et donc le fichier n'est pas créé. La connexion est ouverte lors de la première requête

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    D'accord, merci

    Claude

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/01/2012, 20h20
  2. [EF][C#] Pas d'exception sur ouverture de base
    Par ClaudeBg dans le forum Linq
    Réponses: 5
    Dernier message: 20/01/2009, 17h55
  3. Réponses: 8
    Dernier message: 25/06/2007, 14h07
  4. levée d'exception sur ouverture fichier excel
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/10/2006, 14h30
  5. EXCEPTION sur l'ouverture d'un curseur
    Par atruong dans le forum Oracle
    Réponses: 6
    Dernier message: 03/05/2006, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo