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

Linq Discussion :

[C#]problème avec SqLite


Sujet :

Linq

  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 [C#]problème avec SqLite
    Bonjour,

    Je viens de terminer un assez gros programme de facturation.
    Sur ma machine, il fonctionne sans problème.
    L'installation et le fonctionnement en version autonome (sans VS) aussi.

    Il utilise SqLite avec linq to Entities

    Dans mon programme, j'ai bien référencé la librairie SqLite avec l'option de copie locale.

    En l'installant sur la machine du destinataire, le programme se lance.
    La création d'un facturier se passe sans problème (la création se fait en bas niveau, par ADO, via SqLite).

    Par contre, impossible de m'y connecter, j'obtiens une erreur précisant que le fournisseur de magasin est invalide ou non installé.

    La librairie SqLite est bien installée dans le répertoire d'installation du programme.

    Sur ma machine, j'ai donc désinstallé SqLite, et j'obtiens effectivement strictement la même erreur.

    Or, je ne suis pas sensé devoir installer SqLite pour faire tourner le programme, puisque l'installation copie la librairie.

    J'ai tenté d'installer SqLite sur la machine destinataire (après tout, c'est un moindre mal), mais ça ne fonctionne pas.

    J'ai donc tenté quelques essais sur ma machine et j'observe que :

    - Si j'installe SqLite SANS cocher la case "utilisation pour visual studio" en fin d'installation, ça ne fonctionne pas. Bref, ça ne fonctionne QUE si j'installe SqLite avec l'option Visual studio.

    - Or, cette case à cocher n'apparaît QUE si visual studio est installé sur la machine cible.

    Je ne peux quand même pas installer VS sur la machine cible rien que pour pouvoir installer SqLite avec cette option.

    Je suis très très très embêté, parce que ça fait 3 mois que je travaille sur ce programme, et qu'au final SqLite m'a mené dans une impasse.

    Voici la partie source de la création du facturier (qui fonctionne que SqLite soit installé ou non) :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
            public static bool ConstruireBase(string NomFichier)
            {
                SQLiteConnection SC = null;                                         // Connexion
                bool result;                                                        // résultat de la méthode
                try
                {
                                                    // CREER LA BASE
                                                    // -------------
                    SQLiteConnectionStringBuilder SCSB = new SQLiteConnectionStringBuilder(); // Création d'un objet de création de chaîne de connexion
     
                    SCSB.DataSource = NomFichier;                                   // nom de la base à créer (on a déjà vérifié que la base n'existait pas déjà
                    SCSB.FailIfMissing = false;                                     // Si la base n'existe pas, alors on la crée automatiquement
                    // on peut aussi mettre un mot de passe avec la propriété password
     
                    string ChaineConnexion = SCSB.ToString();                       // récupérer la chaîne de connexion construite avec les paramètres précédents
                    SC = new SQLiteConnection(ChaineConnexion);                     // Créer la connexion
                    SC.Open();                                                      // ouvrir la connexion, puisque la base n'existe pas, la créer
     
                                                    // CREER LA TABLE Version
                                                    // ----------------------
                    string t = "CREATE TABLE Version(";                             // Cette table contiendra un seul record : le numéro de version
                    t += "NumVersionBase TEXT NOT NULL PRIMARY KEY";                // Numéro de version servant aux vérifications
                    t += ")";
     
                    SQLiteCommand Cmd = SC.CreateCommand();                         // Obtenir un objet permettant de faire passer des commandes SQL sur la base SC
                    Cmd.CommandText = t;                                            // Affecter la requête SQL sous forme d'un texte non vérifié
                    Cmd.ExecuteNonQuery();                                          // exécuter la commande SQL
     
                                                    // CREER LA TABLE  Client
                                                    // ----------------------
                    t = "CREATE TABLE Client(";                                     // On construit la chaîne SQL de construction de la table clients
                    t += "NumClient INTEGER NOT NULL PRIMARY KEY";                  // clé primaire = numéro de client
                    t += ",AdressePtr INTEGER NOT NULL REFERENCES Adresse(Id)";     // pointeur sur l'adresse du client
                    t += ",Titre TEXT NOT NULL ";                                   // Titre (M., Mme, Mlle, Monsieur le Baron, SPRL etc)              
                    t += ",Nom TEXT NOT NULL";                                      // Nom
                    t += ",Prenom TEXT NOT NULL";                                   // Prénom
                    t += ",Details TEXT NOT NULL";                                  // Ligne supplémentaire pour l'expédition (chef personnel, etc).
                    t += ",NumTVA TEXT NOT NULL";                                   // Numéro de TVA
                    t += ",Tel TEXT NOT NULL";                                      // Téléphone
                    t += ",GSM TEXT NOT NULL";                                      // GSM
                    t += ",Fax TEXT NOT NULL";                                      // Fax
                    t += ",Email TEXT NOT NULL";                                    // email
                    t += ",Info TEXT NOT NULL";                                     // informations complémentaires ne faisant pas partie de l'adresse d'expédition
                    t += ")";
     
                    Cmd.CommandText = t;                                            // Affecter la requête SQL sous forme d'un texte non vérifié
                    Cmd.ExecuteNonQuery();                                          // exécuter la commande SQL
     
                                                    // CREER LA TABLE Adresse
                                                    // ----------------------
                    t = "CREATE TABLE Adresse(";                                    // On construit la chaîne SQL de construction de la table
                    t += "Id INTEGER NOT NULL PRIMARY KEY";                         // clé primaire
                    t += ",Rue TEXT NOT NULL";                                      // rue
                    t += ",Numero TEXT NOT NULL";                                   // numéro
                    t += ",Boite TEXT NOT NULL";                                    // Boîte
                    t += ",Localite TEXT NOT NULL";                                 // Localité
                    t += ",CodeP TEXT NOT NULL";                                    // Code postal
                    t += ",Pays TEXT NOT NULL";                                     // Pays
                    t += ")";
     
                    Cmd.CommandText = t;                                            // Affecter la requête SQL sous forme d'un texte non vérifié
                    Cmd.ExecuteNonQuery();                                          // exécuter la commande SQL
     
                                                // CREER LA TABLE Entreprise
                                                // -------------------------
                    t = "CREATE TABLE Entreprise(";                                 // On construit la chaîne SQL de construction de la table
                    t += "Id INTEGER NOT NULL PRIMARY KEY";                         // clé primaire
                    t += ",Coordonnees TEXT NOT NULL";                              // coordonnées de l'entreprise
                    t += ",Logo BLOB";                                              // Logo de l'entreprise 
                    t += ",AffLogo BOOL NOT NULL";                                  // indique si on affiche le logo
                    t += ")";
     
                    Cmd.CommandText = t;                                            // Affecter la requête SQL sous forme d'un texte non vérifié
                    Cmd.ExecuteNonQuery();                                          // exécuter la commande SQL
     
                                                    // CREER LA TABLE Facture
                                                    // ----------------------
                    t = "CREATE TABLE Facture(";
                    t += "Id INTEGER NOT NULL PRIMARY KEY";                         // ID de la facture et clé primaire
                    t += ",Type INTEGER NOT NULL";                                  // type de facture : 0= facture, 1=note de crédit
                    t += ",ClientId INTEGER NOT NULL REFERENCES Client(NumClient)"; // pointeur sur client facturé
                    t += ",AdresseClientId INTEGER NOT NULL REFERENCES Adresse(Id)";// pointeur sur adresse du client à la date de facturation
                    t += ",DetailsPostaux TEXT NOT NULL";                           // détails postaux sur le destinataire réel (2ème ligne adresse)
                    t += ",AdresseTravailId INTEGER NOT NULL REFERENCES Adresse(Id)";   // pointeur sur l'adresse d'exécution du travail
                    t += ",ConditionsId INTEGER NOT NULL REFERENCES Condition (Id)";// pointeur sur condition de vente 
                    t += ",EntrepriseId INTEGER NOT NULL REFERENCES Entreprise(Id)";// pointeur sur coordonnées d'entreprise
                    t += ",Articles BLOB NOT NULL";                                 // Tableau d'articles mis sous forme de texte
                    t += ",DateFact TEXT NOT NULL";                                 // Date de facturation
                    t += ",DateEchean TEXT NOT NULL";                               // Date d'échéance de payement
                    t += ",ModePayement TEXT NOT NULL";                             // Mode de payement
                    t += ",DatePayement TEXT NOT NULL";                             // Date effective du payement
                    t += ",Acompte REAL NOT NULL";                                  // acompte versé
                    t += ",MontantHT REAL NOT NULL";                                // on pourrait se passer des montants (on a les articles -> redondance), 
                    t += ",MontantTVA REAL NOT NULL";                               // mais c'est beaucoup plus rapide pour les affichages de listes
                    t += ")";
     
                    Cmd.CommandText = t;
                    Cmd.ExecuteNonQuery();
     
                                                        // CREER LA TABLE Offre
                                                        // --------------------
                    t = "CREATE TABLE Offre(";
                    t += "Id INTEGER NOT NULL PRIMARY KEY";                         // ID de l'offre et clé primaire
                    t += ",ClientId INTEGER NOT NULL REFERENCES Client(NumClient)"; // pointeur sur client
                    t += ",DetailsPostaux TEXT NOT NULL";                           // détails postaux sur le destinataire réel (2ème ligne adresse)
                    t += ",AdresseTravailId INTEGER NOT NULL REFERENCES Adresse(Id)";   // pointeur sur l'adresse d'exécution du travail
                    t += ",ConditionsId INTEGER NOT NULL REFERENCES Condition (Id)";// pointeur sur condition de vente 
                    t += ",Articles BLOB NOT NULL";                                 // Tableau d'articles mis sous forme de texte
                    t += ",DateOffre TEXT NOT NULL";                                // Date de facturation
                    t += ",DateValide TEXT NOT NULL";                               // Date de fin de validité
                    t += ",MontantHT REAL NOT NULL";                                // montant HT (accélère les listes)
                    t += ")";
     
                    Cmd.CommandText = t;
                    Cmd.ExecuteNonQuery();
     
                                                    // CREER LA TABLE Article
                                                    // ----------------------
                    t = "CREATE TABLE Article(";
                    t += "Id INTEGER NOT NULL PRIMARY KEY";                         // Id de l'article = clé primaire
                    t += ",Description TEXT NOT NULL";                              // descriptif de l'article
                    t += ",PrixUnit REAL NOT NULL";                                 // Prix unitaire de l'article (éviter les null parce que single ou float ne sont pas nullables dans C#, ce qui impose un cast)
                    t += ",DureeRappel INTEGER NOT NULL";                           // Durée en jours du rappel automatique
     
                    t += ")";
     
                    Cmd.CommandText = t;
                    Cmd.ExecuteNonQuery();
     
                                                    // CREER LA TABLE Agenda
                                                    // ---------------------
                    t = "CREATE TABLE Agenda(";
                    t += "Id INTEGER NOT NULL PRIMARY KEY";
                    t += ",ClientId INTEGER NOT NULL REFERENCES Client(NumClient)"; // pointeur sur client facturé
                    t += ",FactId INTEGER REFERENCES Facture(Id)";                  // référence vers la facture qui a forcé l'événement
                    t += ",DateRappel TEXT NOT NULL";                               // Date de rappel
                    t += ",Descriptif TEXT NOT NULL";                               // Descriptif de l'opération
                    t += ")";
     
                    Cmd.CommandText = t;
                    Cmd.ExecuteNonQuery();
     
                                                    // CREER LA TABLE Condition
                                                    // ------------------------
                    t = "CREATE TABLE Condition(";
                    t += "Id INTEGER NOT NULL PRIMARY KEY";                         // Id des conditions
                    t += ",Intitule TEXT NOT NULL";                                 // intitulé
                    t += ",Descriptif TEXT NOT NULL";                               // descriptif
                    t += ",TailleFonte INTEGER NOT NULL";                           // Taille de la fonte
                    t += ")";
     
                    Cmd.CommandText = t;
                    Cmd.ExecuteNonQuery();
     
     
                                    // INSERER LE RECORD DE NUMERO DE VERSION DANS LA TABLE Version
                                    // ------------------------------------------------------------
                    Cmd.CommandText = "INSERT INTO Version VALUES('"+VersionBase+"');";
                    Cmd.ExecuteNonQuery();
     
     
                    result = true;                                                  // opération réussie
     
     
     
                    // Exemples de syntaxe :
                    //SQLCmd.CommandText = "INSERT INTO Employes (Nom, Prenom, Salaire) VALUES ('John', 'Doe', 2100);";
                    //Console.WriteLine(SQLCmd.ExecuteNonQuery()); // Cela nous permettra de voir combien d'entrées auront été affectées
                    //SQLCmd.CommandText = "INSERT INTO Employes (Nom, Prenom, Salaire) VALUES ('Sam', 'Linston', 3600);";
                    //Console.WriteLine(SQLCmd.ExecuteNonQuery()); // Idem.
                }
     
                catch (Exception e)
                {
                    e.Message.SendMessErreur();                                     // message d'erreur
                    result = false;                                                 // Echec de l'opération
                }
                if (SC != null) SC.Close();                                         // si base ouverte, la fermer
                return result;                                                      // retourner résultat
            }

    Et voici la partie "connexion", qui plante si SqLite n'est pas installé sur la machine avec l'option "Visual studio" précisée :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
            public static FactEntities OuvrirDataBase(string FileName)
            {
                FactEntities result = null;                             // Valeur de retour
                string Vers = "";                                       // Version lue dans la table
     
                if (File.Exists(FileName))                              // si le fichier existe
                {
                    if (FileName.ToLower().EndsWith(".fctlt"))          // et si l'extension est valide 
                    {
                        EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
     
                        try
                        {
                            // Créer un constructeur automatique de chaîne de connexion
     
                            // 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://*/FactModele.csdl|res://*/FactModele.ssdl|res://*/FactModele.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 FactEntities(ecsb.ConnectionString);
     
                            // Lire la table Version et récupérer le premier (et unique) record
                            Vers = result.Version.First().NumVersionBase;
     
                            // autre méthode pour lire la version :
                            //var query = from v in result.Version
                            //            select v;
                            //var Vers = query.First().NumVersionBase;
                        }
                        catch (Exception ex)                            // si échec à l'ouverture
                        {
                            MessageBox.Show(ex.Message + "\n" + ex.InnerException.ToString());
                            MessageBox.Show(ecsb.ConnectionString);
     
                            result = null;                              // annuler résultat
                        }
                    }
     
                }
                if (result == null)                                     // si échec, message d'erreur
                    Methodes.SendMessErreur("Impossible de connecter au facturier:\n" + FileName);
     
                else                                                    // La table semble avoir la structure correcte, reste la version à vérifier
                {
                    if (Vers != VersionBase)                            // Si les versions ne correspondent pas
                    {
                        Methodes.SendMessErreur("Le facturier n'est pas compatible avec cette version de FactuLite\n\n"
                            + "Version exigée    : "+VersionBase + "\n" + "Version facturier : "+Vers);  // Envoyer message d'erreur
                        result = null;                                  // et annuler le résultat
                    }
                }
                return result;
            }
    Le message obtenu est :

    Soit le fournisseur de magasins spécifié est introuvable, soit il n'est pas valide.
    System.argument.Exception: Le fournisseur de données .net framework demandé est introuvable. Il n'est peut-être pas installé.
    A System.data.common.dbproviderFactories.GetFactory(string provider invariantname)
    A System.Data.EntityClient.EntityConnection.GetFactory(string providerString)

    Un sauveur providentiel a-t-il la solution miracle pour me sortir de ce mauvais pas?

    Merci 1000 fois d'avance



    Claude

    PS : Je peux fournir les sources et/ou l'exécutable sans problème, le projet est de toutes façons destiné à devenir open-source.

  2. #2
    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 754
    Points
    39 754
    Par défaut
    Est-ce que tu as bien installé les 2 DLL avec le programme ?
    - System.Data.SQLite.dll
    - System.Data.SQLite.Linq.dll
    Et vérifie aussi que c'est la bonne version (pour un OS 64 bits il faut prendre la version qui est dans le répertoire x64 de SQLite.NET, sinon ça marche pas...)

    Sinon, ça pourrait être parce que le provider SQLite n'est pas déclaré dans le fichier machine.config. Dans ce cas le mieux est de l'ajouter dans le app.config de ton application :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <system.data>
        <DbProviderFactories>
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
        </DbProviderFactories>
      </system.data>
    </configuration>

  3. #3
    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
    Merci de t'intéresser à mon problème.

    Pour les deux librairies, j'ai testé, ça ne change rien.

    Pour l'ajout, j'obtiens une erreur à l'exécution qui m'indique des doublons (ligne présente deux fois).

    Et pour le reste, en fait le programme fonctionne parfaitement sur ma machine.

    En fait, j'ai poursuivi mes investigations, et j'ai pu encore mieux cerner le problème :

    Imagine ma machine, avec SqLite installé, et le logiciel Factulite (l'appli) installée. Vs2008 est fermé.

    Tout fonctionne nickel : création de documents (Ado) et ouverture (entities).

    Maintenant, je vais dans le menu de Sqlite et je sélectionne "Design-Time configuration. J'ai une case cochée dans la fenêtre "Install SqLite Desing-time support for the following environments". Et ce checkobox précise : "Visual studio 2008 (full edtions).

    Si je décoche la case, et que je relance FacuLite, ça ne fonctionne plus : Ok pour création, échec en ouverture.

    Je réouvre la config, je recoche la case, et FactuLite refonctionne.

    En cochant/décochant la case, j'active/Désactive manifestement quelque chose qui est indispensable à Linq to Entities sur SqLite, alors que SqLite via Ado continue de fonctionner.

    Si je coupe la case j'ai en outre une erreur dans VS qui n'arrive pas à gérer le modèle Entities (mais ça, c'est normal). Mon impression est que ce qui est nécessaire à Visual studio pour gérer SqLite en mode entities est en fait également nécessaire pour faire fonctionner l'application en mode autonome si elle utilise aussi entities, ce qui est mon cas.
    Ca expliquerait que l'application crée bien les nouveaux documents, mais n'arrive pas à connecter dessus, vu que je connecte via linq to entities et que je crée via Ado.

    Or, si je regarde le répertoire d'installation de SqLIte, rien ne change, case cochée ou non.

    Si je liste les processus actifs, rien ne change non plus quand j'active la case.
    Je ne trouve pas où ce composant va se nicher, ni ce qui s'exécute.

    Mon problème étant que si j'installe sqLite sur une machine qui ne dispose pas de Visual Studio, la fameuse checkbox n'apparaît pas ni à l'installation de SqLIte, ni dans la configuration. Je ne peux donc pas lancer ce mystérieux composant, et donc le programme ne fonctionne pas.

    Je ne peux pas décemment dire aux futurs utilisateurs qu'ils doivent installer VIsual Studio juste pour faire apparaître la checkbox.

    Tu as une idée de ce qui se passe, ou, mieux, une piste pour solutionner?

    Merci 1000 fois

    Claude

    PS : je précise que j'ai chargé ici : http://sourceforge.net/project/showf...kage_id=145568 et que l'auteur de SqLite que j'ai contacté me précise qu'il n'a rien à voir avec cette version.

  4. #4
    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 754
    Points
    39 754
    Par défaut
    Citation Envoyé par ClaudeBg Voir le message
    Pour l'ajout, j'obtiens une erreur à l'exécution qui m'indique des doublons (ligne présente deux fois).
    C'est parce que sur ta machine de dev, quand SQLite.NET est correctement installé (avec l'option VS2008 cochée), la définition du provider ADO.NET SQLite est déjà présente dans le fichier machine.config (C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config). Les providers définis dans le fichier de config de ton appli s'ajoutent à ceux qui sont déjà présents dans machine.config, d'où l'erreur.

    Pour éviter ce problème de doublon sur une machine ou SQLite.NET est déjà installé, il suffit d'ajouter un remove avant le add :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <system.data>
        <DbProviderFactories>
          <remove invariant="System.Data.SQLite"/>
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
        </DbProviderFactories>
      </system.data>
    </configuration>

    En fait, je pense que le problème est lié à l'installeur de SQLite.NET. C'est lui qui ajoute ou enlève le provider ADO.NET au fichier machine.config selon que la case soit cochée ou non (il doit aussi faire autre chose, mais j'ai vérifié que ça). Normalement il devrait toujours ajouter le provider, pas seulement quand on coche la case. Ce n'est pas spécifique à Visual Studio, c'est pour tous les programmes .NET...

    Bref, de toutes façons, j'ai fait un test de mon côté, et il en ressort qu'il n'est pas nécessaire d'installer SQLite.NET, il suffit :
    - d'avoir les 2 DLL dans le répertoire de l'exécutable
    - de modifier le fichier .config de l'appli comme je t'ai montré

    J'ai testé avec une appli à moi qui utilise SQLite et Linq to Entities, et ça marche sans problème même après avoir désinstallé SQLite.NET

    Citation Envoyé par ClaudeBg Voir le message
    PS : je précise que j'ai chargé ici : http://sourceforge.net/project/showf...kage_id=145568 et que l'auteur de SqLite que j'ai contacté me précise qu'il n'a rien à voir avec cette version.
    SQLite.NET et SQLite sont 2 projets distincts... SQLite est une petite base de données qui tourne sur de très nombreuses plateformes (Windows, Linux, Mac OS, iPhone...), SQLite.NET est un provider ADO.NET pour utiliser SQLite en .NET. Les 2 projets ne sont pas développés par les mêmes personnes.

    L'auteur de SQLite.NET est Robert Simpson, tu peux le contacter via le forum de SQLite.NET, il répond en général assez vite

  5. #5
    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
    Bonjour,

    Citation Envoyé par tomlev Voir le message
    C'est parce que sur ta machine de dev, quand SQLite.NET est correctement installé (avec l'option VS2008 cochée), la définition du provider ADO.NET SQLite est déjà présente dans le fichier machine.config (C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config). Les providers définis dans le fichier de config de ton appli s'ajoutent à ceux qui sont déjà présents dans machine.config, d'où l'erreur.
    Pour éviter ce problème de doublon sur une machine ou SQLite.NET est déjà installé, il suffit d'ajouter un remove avant le add :
    Extraordinaire )))
    La bonne explication et la bonne solution, ça fonctionne nickel.
    Sans ces lignes, j'étais complètement bloqué.

    Merci ))

    En fait, je pense que le problème est lié à l'installeur de SQLite.NET. C'est lui qui ajoute ou enlève le provider ADO.NET au fichier machine.config selon que la case soit cochée ou non (il doit aussi faire autre chose, mais j'ai vérifié que ça).
    Ca semble effectivement le cas chez moi.

    Normalement il devrait toujours ajouter le provider, pas seulement quand on coche la case. Ce n'est pas spécifique à Visual Studio, c'est pour tous les programmes .NET...
    Je me doutais d'un truc de ce genre, mais j'ignorais où chercher et ce qu'il fallait chercher. Heureusement que tu étais là.

    Bref, de toutes façons, j'ai fait un test de mon côté, et il en ressort qu'il n'est pas nécessaire d'installer SQLite.NET, il suffit :
    - d'avoir les 2 DLL dans le répertoire de l'exécutable
    - de modifier le fichier .config de l'appli comme je t'ai montré
    Effectivement, je confirme : ça fonctionne comme ça.

    SQLite.NET et SQLite sont 2 projets distincts... SQLite est une petite base de données qui tourne sur de très nombreuses plateformes (Windows, Linux, Mac OS, iPhone...), SQLite.NET est un provider ADO.NET pour utiliser SQLite en .NET. Les 2 projets ne sont pas développés par les mêmes personnes.
    Ok, je comprends mieux. Je pensais que sqlite.net était une version de SqLite à laquelle on avait ajouté un install et quelques suppléments pour rendre compatible dotnet. En fait, il n'y a que le nom en commun.

    L'auteur de SQLite.NET est Robert Simpson, tu peux le contacter via le forum de SQLite.NET, il répond en général assez vite
    Merci du tuyau. En cas de besoin, je le saurai.

    Edité après l'essai : J'avais du reste posté un help sur son site, et il vient de me répondre que l'explication était dans le help de son produit. Effectivement, ça l'est, j'aurais du lire plus attentivement, mais il faut dire que vu le nombre de documents que j'ai du lire pour me lancer dans C#, j'ai loupé des trucs.

    Encore 1 million de "merci" (plus un dans la fenêtre "remerciement" de mon programme).

    Claude

  6. #6
    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 754
    Points
    39 754
    Par défaut
    Citation Envoyé par ClaudeBg Voir le message
    Petite question pratique : comment as-tu fait pour te rendre compte du changement? Tu savais déjà où chercher ou tu as des outils pour pister les modifications effectuées par les programmes?
    Ben je savais où étaient déclarés les providers ADO.NET, donc je me doutais que l'installeur devait faire des modifs à cet endroit là...

    Citation Envoyé par ClaudeBg Voir le message
    Ok, je comprends mieux. Je pensais que sqlite.net était une version de SqLite à laquelle on avait ajouté un install et quelques suppléments pour rendre compatible dotnet. En fait, il n'y a que le nom en commun.
    Ben pas que le nom quand même... SQLite.NET utilise SQLite, ce n'est pas complètement indépendant. En fait, pour être exact, SQLite.NET est ce qu'on appelle un assembly mixte : il contient du code managé (code .NET MSIL interprété par la machine virtuelle), et le code natif de la librairie SQLite, pour éviter d'avoir à déployer celle-ci en plus.


    N'oublie pas le bouton

  7. #7
    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
    N'oublie pas le bouton
    Oups, désolé. Je vois que tu l'as fait pour moi, merci.

    En fait, pour être exact, SQLite.NET est ce qu'on appelle un assembly mixte : il contient du code managé (code .NET MSIL interprété par la machine virtuelle), et le code natif de la librairie SQLite, pour éviter d'avoir à déployer celle-ci en plus.
    Ok, j'ai vu, merci.

    A propos, ça intéresse ce site si je propose mes sources comme tutorial ou n'importe quoi d'autre?

    Je viens de débuter en C#, et j'ai pour l'instant quelques contrôles sans prétention. Ils ont "l'avantage de l'inconvénient", c'est à dire que réalisés par un débutant en dotnet, j'y ai expliqué les points où j'ai buté.

    - Un dateTimePicker qui intègre 3 couleurs : normal, disabled, et focus

    - Un Combobox avec mode readonly, restriction possible du choix aux seules possibilités proposées, couleur associée et quelques fonctionnalités

    - Un richtextBox avec le même genre de fonctionnalités et menus intégrés

    - Un slider destiné à remplacer le trackbar, et qui peut prendre n'importe quel aspect (curseur de table de mixage etc), complètement paramétrable. C'est la toute première chose que j'ai faite en dotnet.

    - Un textBox qui dispose de plusieurs fonctionnalités supplémentaires, et de la possibilité de fonctionner en mode complètement numérique (un mode chiffreBox en somme), avec mise en forme, choix du format d'affichage, et complètement paramétrable

    - Plus Le programme dont je parlais : un facturier complet, avec offres de prix, notes de crédit, factures, agenda automatique, gestion d'articles et de clients, bilans, etc. Il contient quelques fonctionnalités au niveau des sources, comme l'impression d'un richtextbox avec possibilité de calculer la hauteur du texte imprimé à l'avance etc. Réalisé "sur mesure" pour un ami, il contient des options inhabituelles (comme l'édition et la suppression de factures déjà enregistrées).

    Note que je suis un maniaque du commentaire, et donc les sources constituent un peu un mini-tutorial.

    Si ça peut faire plaisir, j'envoie sans problème, il suffit de me dire quoi envoyer et sous quelle forme. De toutes façons, je propose mes applications en open-source sur mon site.

    En tout cas, encore merci pour toutes les aides, car ce premier projet m'a servi en plus de base d'apprentissage, et ce site m'y a bien aidé. Maintenant, je vais pouvoir me ré-attaquer à mon logiciel de domotique (pour l'instant en VB6), et vu les évolutions prévues, c'est plus consistant, LOL

    Claude

  8. #8
    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 754
    Points
    39 754
    Par défaut
    Effectivement si tu peux en tirer un tuto ça peut être intéressant... par contre je pense qu'il faudrait cibler un peu mieux le sujet du tuto, si tu le fais sur toute l'appli ça risque de faire un peu fourre-tout. Par exemple tu pourrais centrer ça sur l'aspect Linq to Entities et la façon dont on peut le mettre en oeuvre dans une appli (*), ou encore sur la création de contrôles personnalisés.

    Et bien sûr il y a un travail de rédaction, un tuto ce n'est pas seulement du code... En tous cas si tu as envie de te lancer, n'hésite pas


    (*) il y a déjà un tuto sur Entity Framework, mais d'un niveau relativement élevé, et pas basé pas sur un cas concret, donc c'est pas forcément redondant si tu en fais un là-dessus.

  9. #9
    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
    Ok, je vois ça lorsque j'aurai un trou.

    Je suis déjà un peu habitué d'écrire des tutos ou des cours, ça ne me changera pas beaucoup, LOL.
    Mon problème c'est toujours le temps

    Encore merci à toi et aux membres de ce site

    Claude

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

Discussions similaires

  1. Problème avec SQLite
    Par sebasti1-88 dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/06/2011, 20h40
  2. problème avec sqlite
    Par nagca dans le forum Android
    Réponses: 1
    Dernier message: 08/06/2011, 10h08
  3. Réponses: 4
    Dernier message: 25/06/2010, 17h05
  4. Problème avec Sqlite lors de la compilation
    Par Jiyuu dans le forum Déploiement/Installation
    Réponses: 6
    Dernier message: 28/11/2009, 18h32
  5. Problème avec SQLITE
    Par Jiyuu dans le forum Django
    Réponses: 2
    Dernier message: 12/03/2009, 07h07

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