none
Déploiement application .Net avec Db Sqlite RRS feed

  • Question

  • Bonjour à tous,

    Je ne sais pas si c’est le bon forum pour poser cette question.

    J’ai développé une petite application en Windows Forms C# qui utilise Sqlite et créé au démarrage un fichier de base de donnée dans un répertoire que je spécifie.

    Je souhaite à présent déployer mon application. J’ai pour cela utilisé InstallShield que j’ai intégré à mon projet. Mon dossier d’installation se créé correctement.

    L’installation se fait correctement sur ma machine, mais une fois que je lance mon application elle ne démarre pas et j’ai le message d’erreur suivant :


    Signature du problème :
      Nom d’événement de problème:	CLR20r3
      Signature du problème 01:	appli.exe
      Signature du problème 02:	1.0.0.0
      Signature du problème 03:	5515b04b
      Signature du problème 04:	mscorlib
      Signature du problème 05:	4.0.30319.18408
      Signature du problème 06:	52310b91
      Signature du problème 07:	36be
      Signature du problème 08:	c5
      Signature du problème 09:	MXYABJ2RSFG4UKNKGMSPJ2KFPMZXHCC5
      Version du système:	6.1.7601.2.1.0.256.1
      Identificateur de paramètres régionaux:	2060
      Information supplémentaire n° 1:	0a9e
      Information supplémentaire n° 2:	0a9e372d3b4ad19135b953a78882e789
      Information supplémentaire n° 3:	0a9e
      Information supplémentaire n° 4:	0a9e372d3b4ad19135b953a78882e789
    
    Lire notre déclaration de confidentialité en ligne :
      http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x040c
    
    Si la déclaration de confidentialité en ligne n’est pas disponible, lisez la version hors connexion :
      C:\Windows\system32\fr-FR\erofflps.txt

    Comme c’est la première fois que j’utilise InstallShield j’ai aussi quelques questions :

    -        Quand on utilise Sqlite est-ce qu’on peut stocker le fichier db où l’on souhaite ou faut-il le mettre à un endroit précis ?

    -        Les dll de Sqlite sont-elles automatiquement jointes lors de l’instal ?

    -        Est-ce que c’est la création du fichier de bd qui pose problème ? Pour info, mon application tourne très bien en mode Debug.

    Merci à tous pour votre aide.


    mardi 31 mars 2015 09:59

Réponses

  • Bonjour,

    je pense avoir résolu mon problème qui finalement étaient plusieurs problèmes :

    1. Je créer mon fichier db directement. Je n'attends pas que sqlite le créé automatiquement 
    2. Le problème de la connexionString. En fait, il ne savait jamais lire mon fichier db.
      Après plusieurs recherches je suis tombé sur Ceci où l'on conseil d'utiliser la class SQLiteConnectionStringBuilder
      J'ai donc créer une méthode qui retourne un SqliteConnectionStringBuilder
    public static SQLiteConnectionStringBuilder ConnexionBuilder(string connexion)
            {
                SQLiteConnectionStringBuilder conn_builder = new SQLiteConnectionStringBuilder
                {
                    DateTimeFormat = SQLiteDateFormats.ISO8601,
                    SyncMode = SynchronizationModes.Off,
                    Version = 3,
                    JournalMode = SQLiteJournalModeEnum.Truncate,
                    DefaultIsolationLevel = System.Data.IsolationLevel.ReadCommitted,
                    Pooling = true,
                    DataSource = connexion,
                    DefaultTimeout = 5000,
                    PageSize = 65536,
                    CacheSize = 16777216,
                    FailIfMissing = false,
                    ReadOnly = false
                };
                return conn_builder;
            }

    Du coup cela fonctionne.

    3. L'autre problème que je rencontrais lorsque je lançais mon application (déployée) c'est qu'elle ne démarrait pas, plantait directement et j'avais une erreur CLR20r3 (Voir début de ce message). 

    Une des lignes mentionne :

    Identificateur de paramètres régionaux:	2060

    J'utilise en effet dans mon projet la localization avec plusieurs langues.

    J'ai donc refait mes fichiers ressources langues proprement. Je pense qu'il manquait la version neutre.

    Je n'ai pas encore testé sur mon gros projet mais j'ai reproduit dans ce projets les différentes parties qui à mon avis pouvaient poser problème et en effet je retrouvais les mêmes erreurs que sur mon gros projet.

    Je pense donc que mon problème est résolu.

    En espérant que cela pourra en aider d'autres !

    Merci à tous pour votre aide 



    • Marqué comme réponse paintbox00 lundi 6 avril 2015 16:49
    lundi 6 avril 2015 16:48

Toutes les réponses

  • Bonjour paintbox00,
    Vérifiez que la version de .NET framework du système opérationnel sur lequel vous lancez l'application est la même ou plus récente que celle de l'application.

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 1 avril 2015 09:19
    Modérateur
  • Bonjour Nina,

    merci pour votre aide.

    J'avoue ne pas trop savoir ou vérifier la version du .NEt Framwork sur ma machine. En faisant des recherches sur Internet j'ai vu qu'il fallait lancer regedit.exe mais une fois là dedans, je ne vois pas ou je peux trouver l'info dans cette longue liste.

    Je pense plutôt que mon problème est que au lancement de mon application si c'est la 1ere fois je créé le fichier de base de données. Je pense que c'est là que cela pose problème.

    Je ne sais pas comment dans le fichier App.config spécifier le chemin de l'application courante ou au moins un chemin spécifique sur le poste utilisateur. 

    Chez moi cela fonctionne puisque j'indique "c:\user\moi\monDossier".

    Je devrais pouvoir spécifier "c:\user\utilisateurCourant\sonDossier".

    Merci

    mercredi 1 avril 2015 13:01
  • J'ai refait un mini projet avec Sqlite.

    L'install fonctionne, l'application se lance mais la db ne se créé pas.

    J'indique pourtant dans mon app.config de créer la db dans le dossier de l'application comme ceci :

    <add name="ConnectionString"
          connectionString="Data Source=|DataDirectory|\MyDb.db;Initial Catalog=MyDataBase;Integrated Security=True"
          providerName="System.Data.SQLite" />

    Cela fonctionne sur ma machine en mode debug mais pas lorsque j'installe l'application. Je n'ai pas de message d'erreur.

    Y-a-t-il quelque chose de particulier à faire?

    Merci

    vendredi 3 avril 2015 06:14
  • Bonjour,

    Vous devez choisir entre:

    - créer un fichier db vide qui doit être incorporé à l'installateur.

    - soit le programme créer le fichier db à l'exécution si celui ci n'existe pas. Dans ce cas vous n'avez pas besoin d'incorporer un fichier db vide dans l'installateur.

    Si vous avez fait le premier choix, vérifier qu'après l'installation le fichier DB est bien présent là ou vous le souhaitez sur l'ordinateur de l'utilisateur.

    Pour les répertoires, Windows met à la disposition des programmeurs répertoires spéciaux pour enregistrer des informations ou des DB spécifiques aux programmes.

    Par exemple pour tous les utilisateurs: 
    string l_RepCommunData = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
    string l_RepDataApp = System.IO.Path.Combine(l_RepCommunData, "Société\\MonAppli");

    Pour l'utilisateur courant           
    string l_RepData = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    l_RepDataApp = System.IO.Path.Combine(l_RepData ,"Société\\MonAppli");

    Si vous avez besoin d'un pilote ODBC particulier, vérifier qu'il est bien installé sur le poste de l'utilisateur.

    Cordialement
    Gérard


    • Modifié GP79 vendredi 3 avril 2015 08:14
    vendredi 3 avril 2015 08:06
  • Merci GP79 pour c'est informations.

    Mon application vérifie si la db existe déjà, si non elle la créé.

    Donc on ne peut pas sauver un fichier où on le souhaite?

    Quelle est la différence entre le l_RepData et l_RepDataApp? Dans quel cas utiliser l'un plutôt que l'autre?

    Comment préciser ces infos directement dans le app.config? 

    Merci !


    vendredi 3 avril 2015 08:48
  • Cela ne semble pas fonctionner. J'ai un NullReferenceException.

    Mon fichier de db ne se créé pas parce que l'exception apparaît quand je veux lire les données.

    Pourtant je pense que ma connexion est correcte:

     static string l_RepData = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
     static string Connexion = System.IO.Path.Combine(l_RepData, "MaSociete\\MonAppli");

    vendredi 3 avril 2015 10:00
  • Environment.SpecialFolder.CommonApplicationData
    Ce répertoire est accessible par tous les utilisateurs (session windows)

    Environment.SpecialFolder.ApplicationData
    Ce répertoire est propre à chaque utilisateur (session windows)
    Ce qui signifie, pour un nouvel utilisateur windows (session avec login et mot de passe)
    le programme créera une nouvelle base de données

    Si vous utilisez ce répertoire, votre programme créera une base de données pour chaque utilisateur.

    Vous dites: Mon fichier de db ne se créé pas parce que l'exception apparaît quand je veux lire les données.

    Avant de lire les données il faut vérifier que le fichier existe.

    Cordialement
    Gérard


    • Modifié GP79 vendredi 3 avril 2015 10:20
    vendredi 3 avril 2015 10:18
  • Je teste l’existence de mon fichier de db comme ceci :

    private void btnRead_Click(object sender, EventArgs e)
            {
                DataTable dt = null;
    
                if (File.Exists(Connexion))
                {
                    dt = User.GetUser();
                }
                else
                {
                    tbLogin.Text = "Base de données inexistante !";
                }
                
    
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        tbLogin.Text = dr["Login"].ToString();
                        tbPass.Text = dr["Password"].ToString();
                    }
                }
                else
                {
                    tbLogin.Text = "Pas de données";
                }
    
            }

    Normalement, s'il n'existe pas il devrait tomber dans le 1er Else et afficher 

    "Base de données inexistante !"
    ce qu'il ne fait pas. Il plante.

    Je pense que mon erreur doit venir de ma connexionString et pourtant je ne vois pas ce qui n'est pas bon? 

    static string dbDirectopry = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            static string dbName = "MySqliteDb.db";
    
            static string Connexion = Path.Combine(dbDirectopry, @"MaSociete\MonAppli\" + dbName);

    vendredi 3 avril 2015 11:59
  • DataTable dt = null;i
    i
    f (File.Exists(Connexion))
    {
    dt
    = User.GetUser();
    }
    else
    {
    tbLogin.Text = "Base de données inexistante !";

    //ICI dt = null;
    //il faut absolument sortir ou créer la base de données
    return
    }

    //L'erreur a lieu ici
    if (dt.Rows.Count > 0) {
    ...}


    vendredi 3 avril 2015 12:29
  • Je ne l'avais pas mis, mais j'ai bien une méthode que j'appelle en cliquant sur 1 bouton et qui créé ma db.

    private void button1_Click(object sender, EventArgs e)
            {
                SqLiteHelper sqlite = new SqLiteHelper(Connexion);
    
                toolStripStatusLabel1.Text = "Préparation de la Base de données";
    
                try
                {
                    Install.CreateDb(Connexion);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
                toolStripStatusLabel1.Text = "Base de données créée";
            }
     

    Cela fonctionne quand je suis en mode debug, ma db se créé et mes données sont bien insérées dans ma table.

    Une fois que je passe en production (donc sur une machine) cela ne fonctionne pas.

    vendredi 3 avril 2015 12:56
  • Bonjour,

    je pense avoir résolu mon problème qui finalement étaient plusieurs problèmes :

    1. Je créer mon fichier db directement. Je n'attends pas que sqlite le créé automatiquement 
    2. Le problème de la connexionString. En fait, il ne savait jamais lire mon fichier db.
      Après plusieurs recherches je suis tombé sur Ceci où l'on conseil d'utiliser la class SQLiteConnectionStringBuilder
      J'ai donc créer une méthode qui retourne un SqliteConnectionStringBuilder
    public static SQLiteConnectionStringBuilder ConnexionBuilder(string connexion)
            {
                SQLiteConnectionStringBuilder conn_builder = new SQLiteConnectionStringBuilder
                {
                    DateTimeFormat = SQLiteDateFormats.ISO8601,
                    SyncMode = SynchronizationModes.Off,
                    Version = 3,
                    JournalMode = SQLiteJournalModeEnum.Truncate,
                    DefaultIsolationLevel = System.Data.IsolationLevel.ReadCommitted,
                    Pooling = true,
                    DataSource = connexion,
                    DefaultTimeout = 5000,
                    PageSize = 65536,
                    CacheSize = 16777216,
                    FailIfMissing = false,
                    ReadOnly = false
                };
                return conn_builder;
            }

    Du coup cela fonctionne.

    3. L'autre problème que je rencontrais lorsque je lançais mon application (déployée) c'est qu'elle ne démarrait pas, plantait directement et j'avais une erreur CLR20r3 (Voir début de ce message). 

    Une des lignes mentionne :

    Identificateur de paramètres régionaux:	2060

    J'utilise en effet dans mon projet la localization avec plusieurs langues.

    J'ai donc refait mes fichiers ressources langues proprement. Je pense qu'il manquait la version neutre.

    Je n'ai pas encore testé sur mon gros projet mais j'ai reproduit dans ce projets les différentes parties qui à mon avis pouvaient poser problème et en effet je retrouvais les mêmes erreurs que sur mon gros projet.

    Je pense donc que mon problème est résolu.

    En espérant que cela pourra en aider d'autres !

    Merci à tous pour votre aide 



    • Marqué comme réponse paintbox00 lundi 6 avril 2015 16:49
    lundi 6 avril 2015 16:48