Probleme de connexion base SQLite apres avoir publier l'application [Résolu]

-
Bonjour,
Mon problème est le suivant:
J'ai fait un application pour lire des données provenant d'une base de données SQLite, c'est une sorte de recueil de chanson... tout fonctionne en local, c'est à dire sur l'ordi de production.
Quand je publie (déploiement) mon application avec son fichier setup et que j'essaie mon application sur un autre poste, j'ai mon graphique et tout mais je ne parviens pas à me connecter à la Base de données SQLite; pourtant c’était ok en production.

1) Comment faire pour publier mon application avec sa base de données, avec la possibilité de lire, éditer, supprimer des enregistrements?
J'ai créé une ressource "truc" pour la base de données mais après ça bloque.

Celà fait quelques jours que je cherche sans succès

Voici mon code qui ne fonctionne pas après publication


                    SQLiteConnectionStringBuilder SQLCSB = new SQLiteConnectionStringBuilder();
                    SQLCSB.DataSource = @"C:\Users\Moi\source\repos\projetcsharp2\bases_de_donnees\base_exemple.db"; 
                    string ConnectionString = SQLCSB.ToString();
                    SQLiteConnection SQLC = new SQLiteConnection(ConnectionString);
                    SQLC.Open();
                    SQLiteCommand SQLCmd = SQLC.CreateCommand();
                    SQLCmd.CommandText = "SELECT ref,titre FROM table_choses";
                    SQLiteDataReader SQLDReader = SQLCmd.ExecuteReader();

                    while (SQLDReader.Read())
                    {
//récupération des résultats
       }                    SQLC.Close();



Merci d'avance pour votre aide

David
Afficher la suite 

13 réponses

Meilleure réponse
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
1
Merci
            catch (IOException e)//là tu ne testes que les erreurs du type IOException, toute autre erreur ne sera pas interceptée, il faut toujours mettre un catch général
            {
                MessageBox.Show("erreur de base de données");//non ce n'est pas une erreur de base de données, c'est une erreur IO
                if (e.Source != null)
                    Console.WriteLine("IOException source: {0}", e.Source);//ici vaut mieux un messageBox, tu n'es pas en mode console.....
                Console.ReadLine();//ça faut enlever ça n'a de l'intérêt qu'en mode console
                throw;//ça faut surtout pas, tu n'as pas lu la doc jusqu'en bas

            }
        catch (Exception e)
        {
            MessageBox.Show(string.Format("Message de l'erreur : {0},\r\n source de l'erreur : {1}", e?.Source, e?.Message);
        }

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources 216 internautes nous ont dit merci ce mois-ci

tidave
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
-
en tout cas merci
je vérifie tout ça et je te dis

j'ai créé une nouvelle application toute fresh pour faire les test,
de manière à ne pas trop abîmer l'existant et de pouvoir gerer les erreur pas a pas

je reviens vers vous

Merci encore
tidave
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
-
Salutations
Me revoici avec des nouvelles

En plaçant le nouveau catch, j'ai cette erreur précise, merci pour l'astuce:

System.Data.SQLite,
Source de l'erreur: impossible de charger la DLL 'SQLite.Interrop.dll':
Le module spécifié est introuvable.( Exception de HRESULT: 0x8007007E)

Bizarre tout de même.

pourtant, j'ai J'ai installé System.Data.SQLite par le package NUGet

J'ai télécharger SQLite.Interrop.dll que j'ai mise dans le dossier de l'application sans succès,

Merci encore, on dirait que ça avance
Commenter la réponse de Whismeril
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
0
Merci
Bonjour

je suis prêt à parier que sur le pc de déploiement la base de donnée n'est pas située à l'emplacement
"C:\Users\Moi\source\repos\projetcsharp2\bases_de_donnees\base_exemple.db"; 

Il faut donc faire en sorte que ton application sache où la base de données sera une fois déployée. Il y a deux nombreuses options
  • mettre la BDD dans le dossier de l'exe ou dans un sous dossier et utiliser un chemin relatif (à mon avis le plus simple)
  • stocker le chemin dans un fichier de configuration et éditer ce fichier à la main lors de l'installation
  • stocker le chemin dans un fichier de configuration et demander le chemin à l'utilisateur si le chemin stocké n'est pas bon (bien sûr stocker le chemin corrigé)
  • etc...


PS tu as vu, mon chemin est en rouge alors que ton code est tout gris. Merci à l'avenir de lire et d'appliquer ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Commenter la réponse de Whismeril
0
Merci
Merci pour ta réponse
En effet, sur le pc où l'application est déployée la base de données n'est pas à cet emplacement,

J'ai déja essayé d'appliquer plusieurs solutions sans succès

J'ai créé une ressource truc pour la base de données dans visual studio
Je souhaite utiliser cette ressource dans mon application si possible, si cette méthode est la plus simple.

J'avais fait une application en VB.NET et j'utilisais ce code; comment puis je faire en C#


Dim BDDPath$ = Path.GetTempPath & "\base_exemple.db"
        File.WriteAllBytes(BDDPath, My.Resources.truc)
        Dim strConnexion As New SQLiteConnection("Data Source=" & BDDPath)
        Dim myConnexion As SQLiteConnection = New SQLiteConnection(strConnexion)
            myConnexion.Open()
            Dim sql As String = "select ref,titre from table_choses;"
            Dim cmd As New SQLiteCommand(sql, myConnexion)
            Dim myreader As SQLiteDataReader = cmd.ExecuteReader()
            While myreader.Read()
              ********************
            End While
            myreader.Close()
            myConnexion.Close()



Je ne sais pas si c’était la meilleure méthode mais ça marchait bien

Tu parles de mettre la base dans le EXE et de creer un chemin relatif, tu as un exemple ?
L'utilisateur pourra ouvrir le dossier contenant l’application et avoir accès à la base de données?

Merci de m'aider
Je suis débutant, ça doit surement être le bé a ba... mais bon...

David
Commenter la réponse de tidave
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
0
Merci
Je n’ai de mettre la bdd dans l’exe, mais dans le dossier de l’exe.

Si elle est au même endroit, alors le chemin relatif, c’est juste de le nom du fichier.
Si tu la mets dans un sous dossier alors
string chemin = @« \nom du sous dossier \nom du fichier

Si tu la mets un « étage » plus haut que l’exe alors
string chemin = @« ..\nom du fichier
Commenter la réponse de Whismeril
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
0
Merci
Merci beaucoup
C'est ce que je pensais faire en dernier lieu; vraiment en dernier recours

Mais je préférais la méthode avec la ressource...
je ne voulais pas inclure la base car si l'utilisateur change le dossier de place ça risque de ne pas fonctionner

Merci encore

David
Commenter la réponse de tidave
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
0
Merci
Utiliser la ressource est une option, mais là de suite je ne peux pas t’aider à ce sujet.
Plus tard dans la journée si j’ai un peu de temps.

Sinon, pourquoi ne pas utiliser le fichier de configuration?
Ce tuto date de VS 2005, https://nico-pyright.developpez.com/tutoriel/vc2005/configurationsectioncsharp/
cela a évolué depuis, (par exemple on peut le manipuler dans VS) mais il donne le principe en français

Commenter la réponse de Whismeril
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
0
Merci
Salutations
Décidément ça ne fonctionne pas

j'ai inclus la base au projet, j'ai choisis "toujours copier dans le répertoire de sortie" dans ses propriétés

la base est copiée dans le répertoire debug

je fais :


SQLiteConnectionStringBuilder SQLCSB = new SQLiteConnectionStringBuilder();
                    SQLCSB.DataSource = @"base_exemple.db"; 
                    string ConnectionString = SQLCSB.ToString();
                    SQLiteConnection SQLC = new SQLiteConnection(ConnectionString);
                    SQLC.Open();
                    SQLiteCommand SQLCmd = SQLC.CreateCommand();
                    SQLCmd.CommandText = "SELECT ref,titre FROM table_choses";
                    SQLiteDataReader SQLDReader = SQLCmd.ExecuteReader();
 
                    while (SQLDReader.Read())
                    {
                    ******************
                    }
                    SQLC.Close();


ça ne fonctionne toujours pas
quand je déploie l'application, la base n'est pas lu ou vu

Merci de m'aider
Commenter la réponse de tidave
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
0
Merci
Le @ devant une string sert à ne pas avoir besoin d’échapper les \.
Dans une string sans \, il n’est pas utile.

Quand tu déploies l’application, la base était-elle bien installée avec?
Si oui dans le répertoire de l’exe?
Si oui, y a t il un message d’erreur ?

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
tidave
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
-
Merci
voici le code que j'utilise avec des using



     try
            {
                using (var connection = new SQLiteConnection("Data Source=base_exemple.db"))
                using (var command = connection.CreateCommand())
                {
                    connection.Open();
                    command.CommandText = "select ref,titre from trucs";
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            // gestion de l'affichage des données
                        }
                        listBox1.Items.Add("");
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("erreur de base de données");
 
            }




le try me renvoie : "erreur de base de données

je n'ai pas la base dans le dossier publish apres deploiement

merci

David
Commenter la réponse de Whismeril
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
0
Merci
Bonjour

Tel que tu as écrit ton catch, il est impossible de savoir quelle est l’erreur.
Je te conseille la lecture de la doc en ligne https://docs.microsoft.com/fr-fr/dotnet/csharp/language-reference/keywords/try-catch et à minima, de toujours déclarer une variable du type Exception et d’afficher ce qu’elle raconte.

je n'ai pas la base dans le dossier publish apres deploiement

C’est par là qu’il faut chercher.

Quelle méthode de déploiement utilises tu?
Sais tu que si la Framework est installée sur le PC cible, souvent un simple copier coller du répertoire Realease (après compilation en Realease bien sûr) suffit?


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Commenter la réponse de Whismeril
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
0
Merci
Salutattions
Aussi bizarre que ça puisse paraître la base de données n'est jamais créée dans le dossier "Publish", j'ai regardé aussi dans le sous dossier mais absent au bataillon.

je publie tout simplement avec visual studio (fonction publier)

J'ai encore modifié le code pour tester

 try
            {
                listBox1.Items.Add("");

                  string BDDPath = Path.Combine(Path.GetTempPath(), @"hymnes_et_louangesg.db");
                File.WriteAllBytes(BDDPath, Properties.Resources.truc);

                using (var connection = new SQLiteConnection("Data Source=" + BDDPath))

                using (var command = connection.CreateCommand())
                {
                    connection.Open();
                    command.CommandText = "select ref,titre from trucs";
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())

                        {
                            var titre = reader["titre"].ToString();
                            var num = reader["ref"];
                            titre = titre.Replace(@"\n", "");
                            titre = titre.Replace(@"`", "'");
                            listBox1.Items.Add(" " + num + " - " + titre);
                        }
                        listBox1.Items.Add("");
                    }
                }
            }
            catch (IOException e)
            {
                MessageBox.Show("erreur de base de données");
                if (e.Source != null)
                    Console.WriteLine("IOException source: {0}", e.Source);
                Console.ReadLine();
                throw;

            }


Maintenant la base est créé dans le dossier "temp" grace a ma ressource truc
on progresse

pour tester l'application je place le contenu du dossier publish sur l'autre ordinateur

Merci de l'aide apportée

la fin est proche
vb95
Messages postés
1962
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 novembre 2019
74 -
Bonjour à vous deux
C # est un langage fortement typé : éviter de mettre "var" pour les variables .
Cela ralentit le programme et oblige à faire en interne des conversions de type .
Et dans un projet important il est plus facile de s'y retrouver avec les variables .

Exemple ici tiré de votre code
var titre = reader["titre"].ToString();

à remplacer par
string titre = reader["titre"].ToString();
Commenter la réponse de tidave
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
0
Merci
Salutations
Presque bonne nouvelle,
La base de données est placée automatique dans le répertoire de l'application après déploiement

Mais j'ai encore l'erreur interrop.dll

Merci encore
Whismeril
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319 -
Commenter la réponse de tidave
Messages postés
31
Date d'inscription
vendredi 11 juillet 2008
Statut
Membre
Dernière intervention
26 octobre 2019
0
Merci
Bonsoir à tous....
Il est 3h du matin je vais pouvoir aller dormir

J'ai trouvé la solution au problème....
En fait il n'y avait pas de problème, c'est moi qui faisais des bêtises.

En fait j'utilisais le dossier "publish" au lieu d'utiliser le dossier "debug" pour faire mon setup

Maintenant tout est ok, pas besoin non plus de copier la base de données dans le fichier temps; j'utilise des chemins relatifs.

Je n'ai plus qu'à trouver un moyen de sécuriser ma base de données, je n'aime pas la voir aussi visible sans protection, car il suffirait qu'un utilisateur de mon application recopie la base pour récupérer toutes mes données.

Donc Merci à tous ceux qui m'ont aidé, j'ai appris beaucoup... ça me rappelle mes premiers pas en PHP;

Par contre je n'arrive pas a afficher ma base dans un datagridview en mode design, j'ai l'erreur:
"Une erreur s'est produite lors de l'extraction des informations de la base de données
Le type sélectionné n'est pas prise en charge par ce lecteur"

Celà n’empêche pas l'application de fonction en code par grid datasource...

mais je créerai un autre sujet

Merci encore
Commenter la réponse de tidave
Messages postés
13965
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 novembre 2019
319
0
Merci
Bonjour

En france, on est en plein après-midi ;).

Il ne faut pas utiliser le répertoire debug.
Comme son nom l’indique la compilation en debug sert à debuguer.
Du coup le code contient des « ajouts » inutiles en production, notamment ça ralentit l’exécution.

Il faut compiler en Realease et utiliser ce répertoire.
Je te l’avais écrit plus haut
Commenter la réponse de Whismeril