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

ADO.NET Discussion :

ADO.NET avec SQLite, problème d'activation des clés étrangères (foreign key)


Sujet :

ADO.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut ADO.NET avec SQLite, problème d'activation des clés étrangères (foreign key)
    Bonjour,

    Je vous contacte suite à un problème bloquant rencontré avec SQLite.
    Je n'arrive pas à activer les clé étrangères avec ce SGBD.

    Contexte:
    Framework utilisé: 3.5 de .NET avec le langage C#.
    Provider utilisé: ADO.NET 2.0 Provider for SQLite.
    http://sqlite.phxsoftware.com/
    Moteur de SQLite du provider: 3.6.23.1
    Remarque: La gestion des clés étrangères à été ajouté à partir de la 3.6.19. Source: http://www.sqlite.org/foreignkeys.html#fk_actions
    Visual Studio 2008.
    La chaîne de connexion à la BDD:
    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
     /// <summary>
            /// Repertoire de la BDD
            /// </summary>
            public const string repertoireBDD = "";
            /// <summary>
            /// Chemin complet de la base avec son nom
            /// </summary>
            public const string dbSQLite = repertoireBDD + "dbSQLite.s3db";
            /// <summary>
            /// Chaine de connexion a la BDD
            /// </summary>
            /// <remarks>
            /// Pour trouver la chaine de connexion lie a la BDD, aller ici:
            /// http://www.connectionstrings.com/ 
            /// </remarks>
            public const string connectStringSQLite = "Data source=" + Config.Database.dbSQLite; //+ ";UseUTF16Encoding=True";

    Le code test pour vérifier, activer les clés étrangères et enfin vérifier cette activation:
    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
      string sql = "PRAGMA foreign_keys;"; 
                DbConnection connect = Data_Access_Object.DatabaseDAO.getConnection(Config.Database.providerBDD);   
                connect.Open(); 
                DbCommand dbCommand = Data_Access_Object.DatabaseDAO.createCommand(sql); 
                Object res = dbCommand.ExecuteScalar(); 
                String resString = Convert.ToString(res); 
                Console.WriteLine("\nResultat du pragma: " + resString); 
                connect.Close(); 
     
                string sql2 = "PRAGMA foreign_keys=on;"; 
                connect.Open(); 
                DbCommand dbCommand2 = Data_Access_Object.DatabaseDAO.createCommand(sql2); 
                dbCommand2.ExecuteNonQuery(); 
                connect.Close(); 
     
                connect.Open(); 
                Object res3 = dbCommand.ExecuteScalar(); 
                String resString3 = Convert.ToString(res3); 
                Console.WriteLine("\nResultat du pragma après le ON: " + resString3); 
                connect.Close();
    La sortie de ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Resultat du pragma: 0
     
    Resultat du pragma après le ON: 0
    Comme on peut le voir sur la sortie, le résultat après l'activation est à 0. Or il devrait être à 1, ce que je ne comprend pas.

    Si quelqu'un a une idée sur la raison de cette non activation, je suis preneur !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    c'est bien que le moteur supporte les foreign keys... mais il te faut également un connecteur sqllite qui les prennent en charge...
    en effet, souvent quand une fonction n'est pas prise en charge par la SGBD, les développeurs des connecteurs étrangement, font l'impasse sur la fonctionnalité... c'est dingue non ? lol
    il faut que tu vérifie que le connecteur est bien à jour, genre le dernier sorti, qu'il soit sorti après l'intégration des FK.

    ensuite ce n'est pas non plus parce que le support a été ajouté qu'il est forcément activé au niveau du SGBD et/ou de la base.

  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 753
    Points
    39 753
    Par défaut
    Il y a une autre possibilité, c'est que le provider ne prenne pas en compte la commande PRAGMA. Un test plus pertinent serait d'essayer de violer une contrainte de clé étrangère pour voir si ça te sors bien une erreur...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    @tomlev
    Alors j'ai voulu donner les infos les plus pertinentes donc je n'ai pas indiqué tous les tests effectués en amont.

    Je me suis justement rendu compte de la non gestion des Foreigns keys quand je mettais (update) à jour un enregistrement et qu'il n'y avait aucune répercussion sur l'enregistrement pointant vers l'enregistrement MaJ. De même, je n'ai aucune erreur alors que je violais les contraintes clés étrangères/clés primaires sur un exemple très simple donné par cette documentation officielle:
    http://www.sqlite.org/foreignkeys.html#fk_actions

    @cinemania
    Effectivement, mes soupçons se sont portés sur le provider quand j'ai vu que le moteur SQLite gérait bien les clés étrangères. Ce qui est étrange, c'est que le provider utilise bien une version du moteur qui gère les clés étrangères, même si ce n'est pas la dernière version de SQLite.
    Concernant le provider en lui même, il est à jour. Et sur la documentation du provider, je n'ai pas trouvé de mention claire sur la gestion des clés étrangères.

    J'ai donc au final changé de provider pour utiliser celui là: http://www.devart.com/dotconnect/sqlite/. Et, au miracle, la gestion clé primaire/étrangère fonctionne grâce à la fameuse commande PRAGMA.

    NOTE:
    • Le moteur SQLite, par défaut ne gère pas les clés étrangères/primaires. Il faut lui spécifier à l'aide de la commande PRAGMA si l'on souhaite ou non utiliser les clés étrangères. Ceci est du à une question de compatibilité. ("Foreign key constraints are disabled by default (for backwards compatibility)" Source: http://www.sqlite.org/foreignkeys.html#fk_enable)
    • La commande PRAGMA ne doit pâs être exécuté dans une transaction, autrement le changement ne sera pas pris en compte.

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

Discussions similaires

  1. [SQLite][ADO.NET] utiliser SQLite avec le framework 4
    Par TheBlackReverand dans le forum ADO.NET
    Réponses: 3
    Dernier message: 25/06/2010, 21h05
  2. Réponses: 0
    Dernier message: 27/08/2007, 16h32
  3. [ADO.net et C#]Problème datagrid
    Par moulefrite dans le forum Accès aux données
    Réponses: 3
    Dernier message: 10/12/2006, 20h29
  4. [VB.Net/SQLite] Comment gérer ADO.Net avec ce type de Serveur BD ?
    Par PM_calou dans le forum Accès aux données
    Réponses: 20
    Dernier message: 06/08/2006, 19h42
  5. Réponses: 13
    Dernier message: 21/04/2006, 15h39

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