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

VB.NET Discussion :

Ajouter un enregistrement de BdD avec un binding Navigator


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Ajouter un enregistrement de BdD avec un binding Navigator
    Bonjour,

    sur un form, j'ai des textbox et un binding navigator
    En mode lecture (mode par défault à l'initialisation), les textforms sont bindés à une table d'une bdD au format SDF (MS SQL Server compact 3.5)

    Le BindingNavigator propose un bouton AddNewItem

    1ère question : lorsque je clique sur ce bouton alors que j'ai 6 enregistrements, on s'attendrait à voir le PositionItem se positionner à 7/7. En fait il affiche 1/7 (si j'étais sur l'enregistrement n°1 avant de cliquer). Est-ce normal sachant que forcer la propriété Position du CurrencyManager à 7 n'y change rien. Plus largement que faut-il coder dans l'Event AddNewItem.Click a minima ?

    En faisant appel à mon intuition, je me suis contenté de coder dans l'Event AddNewItem.Click ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub BN_AddNewItem_Click(ByVal sender As System.Object, ByVal e as System.EventArgs) Handles BN_AddNewItem.Click
    BN_Enregistrer.Visible= True 'Rend le bouton "enregistrer" visible
    EndSub
    Ensuite, je vais à l'enregistrement n°7, j'efface les données de mes champs, et je saisis mon nouvel enregistrement, puis je clique sur le bouton Enregistrer


    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
    Private Sub BN_Enregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BN_Enregistrer.Click
            Dim Connexion As New SqlCeConnection(My.Settings.CaveConnectionString)
            Dim RéférenceActive As Integer
            Dim SQL_Ajout As String
     
            SQL_Ajout = "INSERT INTO Table (Champ1, Champ2, Champ3) " & _
                "VALUES ('" 
                TXT_Champ1.Text & "', '" & _
                TXT_Champ2.Text & "', '" & _
                TXT_Champ3.Text & "') "
     
            Connexion.Open()
            Dim commande As New SqlCeCommand(SQL_Ajout, Connexion)
            Try
                commande.ExecuteNonQuery()
     
            Catch ex As Exception
     
            Finally
                Connexion.Close()
            End Try
        End Sub
    2ème question : A quelques soucis de rafraichissements près, je vérifie que, en apparence dans mon application, mon enregistrement a bien été ajouté.
    Pourtant, si je fais "afficher les données de la table" sur la table de mon fichier sdf dans Explorateur de bases de données, je ne retrouve pas mon enregistrement. Où est-il ? Et surtout, si je fais "actualiser", mon enregistrement disparaît dans mon application.

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Pourquoi tu catch sans récupérer l'exception ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Try
                commande.ExecuteNonQuery()
     
            Catch ex As Exception
               MsgBox(Ex.ToString)
            Finally
                Connexion.Close()
            End Try
    Car dans le cas où l'insertion plante, tu passes dans le catch, mais avec ton code, aucune erreur n'en ressort ... Donc impossible de savoir si ça s'est bien déroulé ou pas.

    Tu peux faire du pas-à-pas (F11 sous VS express) pour suivre le fonctionnement de BN_Enregistrer_Click et voir si tes TextBox ont la bonne valeur, si tu passes dans le catch, la requête construite etc

    Pour ta question sur le BindingNavigator je ne peux pas t'aider je ne m'y connais pas.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Mon code était simplifié dans mon exposé mais naturellement, j'ai bien une procédure qui examine les erreurs.
    Je te confirme que le pas à pas n'a rien détecté d'anormal, pas d'entrée dans le catch.
    C'était prévisible puisque, comme je l'explique, mes affichages de BdD prennent bien en compte le nouvel enregistrement, même si je quitte l'appli et que je la relance, mais le SDF ne change pas. Je ne comprends pas comment l'ordinateur stocke durablement ce nouvel enregistrement alors que le SDF ne change pas, et perd la mémoire dès que je fais un "affichage contenu table" en cliquant sur le SDF lui-même.

  4. #4
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Hum difficile à dire comme ca, il me faudrait l'ensemble de ton application.

    Moi dans la mienne j'ai en variable globale à ma form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private BindingSource m_filmTypeBindingSource = new BindingSource();
    ensuite une fonction d'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    m_filmTypeBindingSource.DataSource = VarGlobal.GetInstance().oFilms.Source;
    m_filmTypeBindingSource.Sort = "Titre";
     
    // Evenement d'ajout
    m_filmTypeBindingSource.AddingNew += new AddingNewEventHandler(m_filmTypeBindingSource_AddingNew);
     
    // Evenement de changement de position
    m_filmTypeBindingSource.PositionChanged += new EventHandler(m_filmTypeBindingSource_PositionChanged);
     
    // Initialisatin de la barre de nagigation
    bnFilm.BindingSource = m_filmTypeBindingSource;
    où bnFilm est un bindingNavigator

    Donc dans l'événement de l'ajout d'un nouvel enregistrement je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     // bouton pour ajouter un nouveau film
    private void tsbAdd_Click(object sender, EventArgs e)
    {
       m_filmTypeBindingSource.AddNew();
    }
    et dans mon bouton de validation j'ai un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    m_filmTypeBindingSource.EndEdit();
     
    VarGlobal.GetInstance().oFilms.Update();
    L'update ici faisant appel à la fonction Update de la datatable correspondante à mes films (je travaille avec les DataAdapter et Dataset).

    C'est peut-être pas très clair mais j’espère avoir réussi à t'aider, tient moi au courant si tu as encore des soucis
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  5. #5
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Je suppose que tu réponds à ma question 1 ?

    Je ne comprends pas tout parce que tu utilises des instructions que je ne maîtrise pas encore.
    Cela dit, je te confirme que, naturellement, j'ai un bindingsource en datasource de mon binding navigator.

    En revanche, je suis surpris de cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     // bouton pour ajouter un nouveau film
    private void tsbAdd_Click(object sender, EventArgs e)
    {
       m_filmTypeBindingSource.AddNew();
    }
    En effet, il est dit dans l'aide du binding navigator.AddnewItem que le click sur ce bouton engendre automatiquement l'instruction BindingSource.addNew.

    Dès lors, ton code me semble redondant.

    Enfin, qu'est-ce que VarGlobal ?

    Est-ce que la méthode Update appliquée à une datatable met à jour la base de données à la source ? Je croyais que non et qu'on ne pouvait se faire l'économie d'une clause SQL de type "UPDATE..." ?



    Pour le reste, je vais essayer de comprendre les instructions que tu utilises.

  6. #6
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Pour le code que je t'ai donné ici, il s'agit d'un programme développé en 2008, il est tout à fait possible qu'il y ai eu des améliorations depuis (j'ai pas eu le temps de relire la doc du msdn avant de te répondre).

    Pour VarGlobal, c'est une classe à moi qui est un singleton (permet de créer des variables globales à toute l'application donc dans ton cas tu dois surtout te préoccuper de la logique).

    Justement c'est effectivement l'Update qui met à jour la base de données.

    En effet tu dois normalement avoir un DataAdapter correctement initialisé donc avec une clause SELECT,INSERT, UPDATE et DELETE.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  7. #7
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Pour ta question 2 c'est un peu logique. Je m'explique, ton enregistrement ne se trouve pas dans ta BD , mais a été correctement enregistrée en mémoire dans ton application (dans le dataset ou le datatable). Quand tu fais Actualiser, je suppose que tu relis ta DB et met à jour des objets en mémoire. Vu que ton enregistrement n'est pas dans la DB, et bien il ne sera pas recharger en mémoire.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  8. #8
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Ben je croyais qu'en faisant un "INSERT INTO..." je mettais à jour ma BdD. Si tu me dis que ce n'est pas le cas, alors je n'ai rien compris.

    Dans ce cas,

    - comment se fait-il que mon appli garde en mémoire ma mise à jour tant que je n'active pas le fichier SDF, même si je la quitte et si je la rouvre ? Où cette mise à jour est-elle stockée ?
    - Comment faire pour mettre à jour "en dur" ma BdD (concrétisée par le fichier SDF) ?

  9. #9
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    En fait, dans mes répertoires VS2010/Projects, j'ai 2 fichiers SDF qui n'ont pas la même date de modification :
    - le 1er est dans Projects/nomprojet/nomprojet/bdd.sdf (daté actuellement du 13/09/2013 à 13:55)
    - le 2ème est dans Projects/nomprojet/nomprojet/bin/Debug/bdd.sdf (daté du 13/09/13 à 14:29)

    même nombre de ko pour les 2 fichiers.

    Est-ce que l'explication n'est pas celle-ci :
    - l'explorateur de BdD pointe sur le premier
    - la mise à jour de ma BdD par le code modifie le 2ème uniquement.
    Dans ce cas, quel est le rôle du 1er ?

  10. #10
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Pour les fichiers je ne sais pas t'aider car je code tout moi même sans passer par les outils automatiques de VS.

    Maintenant concerant ta question sur l'INSERT c'est simple : Un enregistrement dans une base de données peut subir 3 actions distinctes en plus de la récupération faite par le SELECT :
    - INSERT qui ajoute l'enregistrement
    - UPDATE qui modifie un enregistrement existant
    - DELETE qui supprime.

    Donc dans un DataAdapter, tu dois avoir les 4 commandes correspondantes (SELECT + les 3 autres) pour pouvoir effectuer toutes les actions.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  11. #11
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Pour les fichiers je ne sais pas t'aider car je code tout moi même sans passer par les outils automatiques de VS.
    Sauf erreur, cela n'a rien à voir avec les outils automatiques de VS.
    A partir du moment où ton appli s'appuie sur une BdD propre à chaque utilisateur, il faut bien que cette BdD puisse être dissociée de l'exécutable (sinon autant utiliser Access...)
    La méthode la plus simple est d'utiliser un serveur SQL :
    - MS Server : format MDF
    - MS Server compact : format SDF
    - SQLite : format db
    pour ne citer que ceux dont j'ai entendu parler.

  12. #12
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Perso je travaille actuellement avec Sqlite, d'ailleurs j'espère finir d'écrire l'article que j'ai commencé
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2011, 19h50
  2. Ajouter des enregistrements dans BDD sans Access installé
    Par bibilolo2 dans le forum Général VBA
    Réponses: 2
    Dernier message: 11/06/2009, 12h27
  3. Enregistrement dans BDD avec boucle: Error!
    Par tryks dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2009, 17h32
  4. Probleme ajout d'enregistrement dans bdd Access
    Par freerider74 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/11/2008, 10h53
  5. enregistrer les données avec le binding navigateur
    Par adel.87 dans le forum Débuter
    Réponses: 11
    Dernier message: 08/10/2008, 16h15

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