none
Incompréhensible RRS feed

  • Question

  • Bonjour à tous,

    Je tombe sur un problème que je ne comprends pas :

    J'ai un formulaire relié à une base de données Access. Comme je ne savais pas où il fallait placer la base de données, j'ai essayé dans le dossier de l'application au même niveau que les répertoires "bin", "MyProject" et "obj". Puis, j'ai placé une copie de la base de données dans le répertoire situé à un niveau plus profond :  \bin\debug\.

    J'ai malencontreusement gardé les deux fichiers [.mdb] à la place où je les avais mis.

    Résultat : Mon application charge les données dans la première base mais les sauvegarde dans la deuxième base. Et mon application refuse de fonctionner si je supprime l'une des deux bases !

    Pour info, l'adresse de la base de données n'est donnée qu'une seule fois dans mon application sous la forme suivante :

    Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=ClassementPB.mdb")

    Qui peut m'aider ?


    Pierre Allemand

    vendredi 20 juin 2014 11:14

Réponses

  • Pour suivre les bonnes pratiques, il faut que ta base de données se trouve dans le dossier des données de l'application. Il s'agit souvent de "C:\Users\[NomUser]\AppData\Local\[AuteurApp]\[NomApp]\[NumVersion]"

    Si tu es dans un programme Winforms, tu peux utiliser Application.UserAppDataPath  qui te renverra ce chemin d'accès pour aller chercher le dossier des données de ton application. C'est là que tu devrais stocker ton fichier. Il faut donc qu'au démarrage tu renseignes "DataDirectory" comme je l'ai mentionné plus haut avec ce "UserAppDataPath" puis que tu mettes ta BDD dedans.

    Si tu as besoin d'autres variables d'environnement, regardes la méthode Environment.GetFolderPath.


    Philippe



    • Marqué comme réponse Pierre Allemand vendredi 20 juin 2014 13:11
    • Modifié PhGr_ vendredi 20 juin 2014 13:16 Correction faute d'orthographe :p
    vendredi 20 juin 2014 13:08

Toutes les réponses

  • Bonjour,

    Dans ton DataSource tu devrais lui spécifier un DataDirectory :

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ClassementPB.mdb;

    Ainsi, tu pourras, dans ton programme, spécifier où est censé se trouver "DataDirectory" avec la méthode AppDomain.SetData. Tu pourras l'appeler ainsi :

    AppDomain.Current.SetData("DataDirectory","c:\LeCheminOùIlDoitAllerChercherLaBDD")

    Si tu ne fais pas cela, j'ai bien peur que l'endroit où il va chercher est assez aléatoire en effet...

    Tiens, regarde ici pour plus d'infos sur les chaînes de connexion...


    Philippe

    vendredi 20 juin 2014 12:10
  • Bonjour Philippe

    Quelque chose n'est pas clair pour moi. Je souhaite simplement mettre le fichier de BD à l'endroit où le système doit logiquement chercher (Ce qui s'appelait "App" dans VB6). Je ne souhaite pas donner d'adresse, car celle-ci dépendra ensuite des conditions dans lesquelles l'application est installée, qui peuvent varier. 

    Donc, ma question est, plus précisément : par quoi doit-on remplacer le "App" de VB6 ?


    Pierre Allemand

    vendredi 20 juin 2014 12:58
  • Pour suivre les bonnes pratiques, il faut que ta base de données se trouve dans le dossier des données de l'application. Il s'agit souvent de "C:\Users\[NomUser]\AppData\Local\[AuteurApp]\[NomApp]\[NumVersion]"

    Si tu es dans un programme Winforms, tu peux utiliser Application.UserAppDataPath  qui te renverra ce chemin d'accès pour aller chercher le dossier des données de ton application. C'est là que tu devrais stocker ton fichier. Il faut donc qu'au démarrage tu renseignes "DataDirectory" comme je l'ai mentionné plus haut avec ce "UserAppDataPath" puis que tu mettes ta BDD dedans.

    Si tu as besoin d'autres variables d'environnement, regardes la méthode Environment.GetFolderPath.


    Philippe



    • Marqué comme réponse Pierre Allemand vendredi 20 juin 2014 13:11
    • Modifié PhGr_ vendredi 20 juin 2014 13:16 Correction faute d'orthographe :p
    vendredi 20 juin 2014 13:08
  • Ça y est, j'ai compris. Je n'avais trouvé nulle part une édition de ces bonnes pratiques et la façon dont Microsoft exprime maintenant les syntaxes est complètement obscure pour moi...

    Merci Philippe


    Pierre Allemand

    vendredi 20 juin 2014 13:14
  • Non, je n'ai pas encore compris...

    Dim DataDirectory As String = Application.UserAppDataPath
    Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=|DataDirectory|ClassementPB.mdb;")

    Je déclare DataDirectory comme string

    Je place ce DataDirectory comme indiqué (mais je comprends qu'il va y avoir un problème de syntaxe : les "|" qui entourent le nom "DataDirectory" dont je ne connais pas l'usage, et l'absence de "\")

    Et effectivement, j'ai le message "Impossible de trouver le fichier ClassementPB.mdb"

    Avec VB6, j'aurais simplement écrit : source= App.Path & "\classementPB.mdb" ce qui est tout de même plus simple...

    En attendant, je ne vois toujours pas comment forcer le système à chercher la BBD là où je l'ai mise...


    Pierre Allemand


    vendredi 20 juin 2014 14:35
  • Le DataDirectory n'est pas à déclarer comme chaîne de caractères, mais il faut utiliser au début de ton application :

    AppDomain.Current.SetData("DataDirectory",Application.UserAppDataPath)

    avant la première ouverture de ta base de données, comme je t'avais montré plus haut. Ainsi, lorsque la chaîne de connexion va regarder le chemin d'accès, il va voir le mot clé spécial "|DataDirectory" qu'il va traduire correctement.

    C'est comme ça que tu pourras le forcer à aller chercher ta base où tu veux.

    [EDIT]
    Au fait, tu as aussi oublié un antislash après "|DataDirectory|" :

    Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=|DataDirectory|\ClassementPB.mdb;")

     


    Philippe



    • Modifié PhGr_ vendredi 20 juin 2014 15:22
    vendredi 20 juin 2014 15:11
  • Où faut-il placer 

    "AppDomain.Current.SetData("DataDirectory",Application.UserAppDataPath)"

    Quelle que soit sa position, je tombe sur le message "Déclaration attendue". N'y-a-t'il pas des "imports" préalables à faire ?


    Pierre Allemand


    vendredi 20 juin 2014 15:32
  • Au temps pour moi,

    Il s'agit de "CurrentDomain" et non pas de "Current". Mais cela dit, tu aurais pu le voir en consultant la doc MSDN ;) : http://msdn.microsoft.com/en-us/library/system.appdomain.aspx


    Philippe




    • Modifié PhGr_ vendredi 20 juin 2014 15:36
    vendredi 20 juin 2014 15:34
  • J'ai remplacé "Current" par "CurrentDomain", mais ça ne change rien. C'est d'ailleurs "AppDomain" qui est souligné.

    Pour la doc MSDN, je dois avouer qu'au-delà de deux termes incompréhensibles, je ne vais pas plus loin, car l'expérience m'a montré que ça ne servait à rien. J'ai un problème de compréhension des termes employés dans les explications. J'ai pourtant vécu un certain temps au Texas. 


    Pierre Allemand

    vendredi 20 juin 2014 15:46
  • Au fait, c'est une question bête, mais tu l'as bien mis dans une méthode? Vu le message d'erreur que tu mentionnes, il semblerait bien que tu l'ais mise en plan dans une classe...

    Il s'agit d'une instruction donc forcément ça se met dans une méthode.

    Comme je fais du c# je ne me souviens plus s'il y a une classe "Program" équivalente en VB qui représente le point d'entrée de l'application. En tous cas, l'idée c'est de mettre cette instruction dans une méthode qui est appelée à l'ouverture de ton application.


    Philippe



    • Modifié PhGr_ vendredi 20 juin 2014 15:54
    vendredi 20 juin 2014 15:53
  • Je dois avouer que j'ai beaucoup, beaucoup de lacunes. Placer la phrase dans une méthode, est-ce que ça veut dire que c'est ailleurs que dans une classe ? Je n'ai jamais vu de programme avec une méthode.

    En fait, je n'ai jamais su par quel bout attraper VB.NET . (Au début, je ne savais même pas comment l'appeler).


    Pierre Allemand

    vendredi 20 juin 2014 15:59
  • Pour faire simple, tu ajouter cet appel dans le constructeur de ta fenêtre principale par exemple. L'idéal serait dans un constructeur statique.


    Philippe

    vendredi 20 juin 2014 16:33