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

Windows Forms Discussion :

Destruction table dans Access par la trace dans VB


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Points : 155
    Points
    155
    Par défaut Destruction table dans Access par la trace dans VB
    Bonjour,

    J'ai un drôle de bug qui m'arrive. J'explique le contexte.

    Je produits une application et aujourd'hui j'ai eu la demande d'ajouter une table dans la BD Access. J'ajoute la table et les champs. Je crée la relation. J'inscris les infos dans la table pour tester l'affichage. Les insertions dans Access pour cette table se passe bien. Je ferme Access et je rouvre Access ensuite pour voir si la table est bien la. Tout va bien jusque là.

    Dans le programme cette table affiche des infos dans un combo box. Tout est codé comme les autres combo box, juste le nom de la table et le binding qui change.

    Le bug je l'ai en pleine face lors de la trace dans le debug.

    En produisant la trace dans VS la table que je viens de rajouter disparait complètement.

    Voici le code pour afficher les infos dans le combo box....

    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
     
     
            Try
                Dim strCon = CStr("provider=microsoft.jet.oledb.4.0;" & "data source= " & Application.StartupPath & "\" & "Demandes.mdb;")
                Cn = New OleDb.OleDbConnection(strCon)
                Cn.ConnectionString = strCon
                Cn.Open()
                CmdR = Cn.CreateCommand() 'Creation de commande
                CmdR.CommandText = "select id_syst, nom_syst from InfosSys order by Id_syst"
                DtSet = New DataSet
                DtAdapteur = New OleDb.OleDbDataAdapter
                DtAdapteur.SelectCommand = CmdR
                DtAdapteur.Fill(DtSet, "InfosSys")
     
                Me.Cmb_Systeme.DataSource = DtSet.Tables("InfosSys")
                Me.Cmb_Systeme.DisplayMember = "Nom_Syst"
                Me.Cmb_Systeme.ValueMember = "id_Syst"
                Cn = Nothing
                CmdR = Nothing
                DtAdapteur = Nothing
                'Objet déconnectée
                DtSet = Nothing
                DtTable = Nothing
                DtRow = Nothing
     
            Catch ex As OleDb.OleDbException
                Cn = Nothing
                CmdR = Nothing
                DtAdapteur = Nothing
                'Objet déconnectée
                DtSet = Nothing
                DtTable = Nothing
                DtRow = Nothing
                MsgBox(ex, MsgBoxStyle.Critical)
            End Try
    Arrivé à la ligne DtAdapteur.Fill(DtSet, "InfosSys") tout plante. J'arrête la trace et je m'appercois que la table InfosSys n'est plus la! Disparus!

    En trois ans de programmation avec Access c'est la première fois que je vois cette chose!

    Je sais que Access n'est pas la BD la plus appréciée et je comprends. Mais là je ne peux pas changer pour SQL Express ou tout autre BD ou SGBD.

    Merci de m'éclairer

    AngelEvil!

  2. #2
    Membre habitué
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Points : 155
    Points
    155
    Par défaut
    Je viens rajouter le message d'erreur que j'ai....

    System.ArgumentException was unhandled
    Message="L'argument 'Prompt' ne peut pas être converti en type 'String'."
    Source="Microsoft.VisualBasic"
    StackTrace:
    à Microsoft.VisualBasic.Interaction.MsgBox(Object Prompt, MsgBoxStyle Buttons, Object Title) à Gestion_Des_Services.GestionDemandes.afficher_systemes() dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\GestionDemandes.vb:ligne 70 à Gestion_Des_Services.GestionDemandes.GestionDemandes_Load(Object sender, EventArgs e) dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\GestionDemandes.vb:ligne 14 à System.EventHandler.Invoke(Object sender, EventArgs e) à System.Windows.Forms.Form.OnLoad(EventArgs e) à System.Windows.Forms.Form.OnCreateControl() à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) à System.Windows.Forms.Control.CreateControl() à System.Windows.Forms.Control.WmShowWindow(Message& m) à System.Windows.Forms.Control.WndProc(Message& m) à System.Windows.Forms.ScrollableControl.WndProc(Message& m) à System.Windows.Forms.ContainerControl.WndProc(Message& m) à System.Windows.Forms.Form.WmShowWindow(Message& m) à System.Windows.Forms.Form.WndProc(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow) à System.Windows.Forms.Control.SetVisibleCore(Boolean value) à System.Windows.Forms.Form.SetVisibleCore(Boolean value) à System.Windows.Forms.Control.set_Visible(Boolean value) à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) à System.Windows.Forms.Application.Run(ApplicationContext context) à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) à Gestion_Des_Services.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81 à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) à System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) à System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) à System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) à System.Activator.CreateInstance(ActivationContext activationContext) à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() à System.Threading.ThreadHelper.ThreadStart_Context(Object state) à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) à System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    Merci

    AngelEvil!

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pas trop compris ... sur quelle ligne l'erreur exactement ?

    et pour info mettre à nothing tes variables si elles sont déclarées dans la sub ca sert à rien
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Points : 155
    Points
    155
    Par défaut
    Bonjour,

    1. Lors de la lecture de la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DtAdapteur.Fill(DtSet, "InfosSys")
    la trace arrête parce que la table InfosSys dans Access disparait! Complètement.

    J'ai un drôle de bug qui m'arrive. J'explique le contexte.

    Je produits une application et aujourd'hui j'ai eu la demande d'ajouter une table dans la BD Access. J'ajoute la table et les champs. Je crée la relation. J'inscris les infos dans la table pour tester l'affichage. Les insertions dans Access pour cette table se passe bien. Je ferme Access et je rouvre Access ensuite pour voir si la table est bien la. Tout va bien jusque là.


    Dans le programme cette table affiche des infos dans un combo box. Tout est codé comme les autres combo box, juste le nom de la table et le binding qui change.

    Le bug je l'ai en pleine face lors de la trace dans le debug.

    En produisant la trace dans VS la table que je viens de rajouter disparait complètement.
    Pourquoi ca fait ca ???? J'aimerais bien comprendre!!!!


    2. Sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DtAdapteur.Fill(DtSet, "InfosSys")
    le code plante, il s'en va dans le Catch et essaie d'afficher le msgbox(ex) .

    Pis la ca plante sur la commande du msgbox(ex) : "L'argument 'Prompt' ne peut pas être converti en type 'String'."

    Voici le message que j'ai dans le clipboard pour cette erreur :

    System.ArgumentException was unhandled
    Message="L'argument 'Prompt' ne peut pas être converti en type 'String'."
    Source="Microsoft.VisualBasic"
    StackTrace:
    à Microsoft.VisualBasic.Interaction.MsgBox(Object Prompt, MsgBoxStyle Buttons, Object Title) à Gestion_Des_Services.GestionDemandes.afficher_systemes() dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\GestionDemandes.vb:ligne 70 à Gestion_Des_Services.GestionDemandes.GestionDemandes_Load(Object sender, EventArgs e) dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\GestionDemandes.vb:ligne 14 à System.EventHandler.Invoke(Object sender, EventArgs e) à System.Windows.Forms.Form.OnLoad(EventArgs e) à System.Windows.Forms.Form.OnCreateControl() à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) à System.Windows.Forms.Control.CreateControl() à System.Windows.Forms.Control.WmShowWindow(Message& m) à System.Windows.Forms.Control.WndProc(Message& m) à System.Windows.Forms.ScrollableControl.WndProc(Message& m) à System.Windows.Forms.ContainerControl.WndProc(Message& m) à System.Windows.Forms.Form.WmShowWindow(Message& m) à System.Windows.Forms.Form.WndProc(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow) à System.Windows.Forms.Control.SetVisibleCore(Boolean value) à System.Windows.Forms.Form.SetVisibleCore(Boolean value) à System.Windows.Forms.Control.set_Visible(Boolean value) à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) à System.Windows.Forms.Application.Run(ApplicationContext context) à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) à Gestion_Des_Services.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81 à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) à System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) à System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) à System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) à System.Activator.CreateInstance(ActivationContext activationContext) à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() à System.Threading.ThreadHelper.ThreadStart_Context(Object state) à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) à System.Threading.ThreadHelper.ThreadStart()
    InnerException:

    3. Pourquoi je ne dois pas faire de nothing sur les object ? C'est pas correct de demander de détruire le lien en mémoire entre l'objet et l'adresse ? C'est orienté objet. On faisait ca en Java dans mes cours. Pis j'ai toujours vu ca dans des livres de programmation VB.NET et dans des tutoriels sur le WEB pour du ADO.NET. La je ne comprends plus rien! Si ce que vous dites est vrai alors il me reste a jeter les livres dans la poubelle!

    Merci de me répondre.

    AngelEvil!

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ex est une exception, msgbox attend une chaine de caractère

    msgbox(ex.message) fonctionnera donc beaucoup mieux !
    donc on verra ce que vaut ex.message
    d'ailleurs tu aurais pu mettre un point d'arret pour voir pourquoi il y avait une erreur dans le catch !




    pour ce qui est du nothing, il sert en effet à détruire le pointeur
    quand une variable n'est plus pointé par aucun pointeur elle est détruite

    par contre une variable est automatiquement mise à nothing en .net dès qu'elle sort de la portée prévue dans le code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public sub
      dim t as object
    end sub
    à la sortie de la sub, t est mise à nothing automatiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class 
      private t as object
      ' (...)
    end class
    ici quand la classe est détruite (si plus rien de pointe sur l'instance de la classe donc), t est mise à nothing automatiquement


    mettre à nothing est donc rarement utile
    par contre .Dipose peut l'etre (pour les objets qui le gère car il libère la mémoire gérée par l'OS (pas par .net directement donc)) ... et encore
    par exemple une connexion sql, une image ...

    imaginons une boucle ou tu instancies une image à chaque tour et que tu n'en as pas besoin aux tours suivants, il vaut mieux la disposer si tu ne veux pas voir la ram monter en flèche

    par contre la mettre à nothing n'est pas utile, soit la variable qui va contenir toutes les images est avant la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim b as bitmap
    for i as integer = 0 to 100
      b = new bitmap(400,400)
      b.dispose
    next
    dans ce cas, b pointe vers une nouvelle valeur à chaque tour, donc celle pointée dans le tour d'avant n'est plus pointée donc elle va etre détruite


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i as integer = 0 to 100
      dim b as bitmap
      b = new bitmap(400,400)
      b.dispose
    next
    et dans ce cas, b a la portée du for, à la sortie du for (voir meme à la sortie du tour je suis pas sur) b sera hors portée est donc mises à nothing automatiquement


    par contre dans certains cas de recherche de performance, on pourrait eventuellement ne pase disposer, un reader et une connexion par exemple
    enfin parce qu'il y a un autre mécanisme de destruction automatique :
    quand une variable se retrouve sans pointeur dessus (mises à nothing manuelle ou auto) le GC va venir vider l'espace mémoire, mais avant celà il appelle une sub sur l'instance nommée finalize, qui pour les classes gérant le dispose appelle la méthode dispose

    donc dans tous les cas la mémoire est bien gérée et faire une fuite mémoire en .net est pas évident (mais reste faisable)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Points : 155
    Points
    155
    Par défaut
    Merci pour l'explication pour le nothing. Ca éclaire des choses!

    Mais pour la destruction de la table lors de la trace... Avez-vous une idée ????

    Parce que je suis vraiment perdu.

    Le message d'erreur (apres correction du code et ajouter msgbox(ex.message)) me dit tout simplement que la table n'est pas dans la BD....

    Problème est qu'avant que je start la trace du code la table est bien la dans la BD. Donc je ne comprends absolument RIEN!

    Ca fait trois fois que je change de nom de table et les noms de champs au cas ou j'utiliserais un mot "protégé" dans Access.

    Mais rien ne change....

    Une idée du problème ????

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    votre connexion pointe t elle sur la bonne base ?
    confirmez vous que la table existe avant execution et n'existe plus dans access suite à l'execution du programme ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Points : 155
    Points
    155
    Par défaut
    La connexion pointe sur la bonne BD qui est bien dans " Application.StartupPath & "\" & "Demandes.mdb " Avant de faire la tace la table est bien dans la BD.

    Je n'ai pas rajouté dans le projet (solution explorer) la BD Access. Donc il pointe vraiment sur le chemin donné avec Application.StartuPath.

    Si vous avez une idée du probleme faites moi signe. Tout le bureau est en train de m'entourer pour essayer de trouver le problème.

    Je me suis fait dire par un employé qu'il se pourrait que ce soit un problème avec la BD. Une corruption.

    On espère que non! Car si c'est le cas je connais un boss qui va s'arracher les cheveux... Entk!

    Merci de vos éclaircissements

    AngelEvil!

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    vérifiez avec un point d'arret que Application.StartupPath pointe bien vers là où vous pensez

    dans access il y a un menu réparation de base

    pas d'autres idées pour l'instant ... pas de drop table executé dans votre code ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre habitué
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Points : 155
    Points
    155
    Par défaut
    applicationstartup pointe sur le bon répertoire.

    Pas de Drop Table dans le programme. c'est juste de la gestion de données basiques.

    Il reste à tester "réparation de base".

    Je laisse la discussion ouverte au cas ou il y aurait d'autres personnes qui voudraient mettre leur idée ici.

    Merci encore

    AngelEvil!

Discussions similaires

  1. Import d'un fichier CSV dans access par VB
    Par Shoezman13 dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/06/2008, 10h43
  2. Ajouter une reference à Access par le code dans un programme VB ?
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 12/12/2007, 00h23
  3. [ACCESS] Comment récupérer paramètre dans Access?
    Par noemieze dans le forum Access
    Réponses: 2
    Dernier message: 05/04/2007, 15h27
  4. Réponses: 3
    Dernier message: 20/07/2006, 15h41
  5. Dans formulaire de recherche avancée dans Access
    Par LeSuisse1 dans le forum Access
    Réponses: 1
    Dernier message: 24/04/2006, 15h59

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