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 :

Mise à jour d'une base de données Access


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut Mise à jour d'une base de données Access
    Bonjour à tous,

    Après le VBA, je débute en VB.Net. Je souhaite dans un premier temps me connecter à une base de données Access (visiblement ça fonctionne) puis modifier un ou deux champs de la table sélectionnée. Vous trouverez le bout de programme ci-dessous.

    Le programme bloque sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            AdaptTest.Update(DtSet, "Test")
    avec l'erreur :
    Erreur de syntaxe dans l'instruction UPDATE
    Visiblement lorsque l'on espionne la requête Update générée, on comprend pourquoi cela ne focntionne pas ; les deux mises à jour sont remplacée par des "?".

    Je fais certainement mal les choses.

    Quelqu'un pourrait-il me conseiller ?

    Merci d'avance.


    déclatations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Connection As New OleDb.OleDbConnection()
        Private DtSet As New DataSet()
        Private AdaptTest As New OleDb.OleDbDataAdapter("select * from [Test]", Connection)
    Programme sur le chargement de la form :

    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
         Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Dim drCurrent As DataRow
            'on parametre la chaine de connection pour la base de donnée testbdd.mdb
            Connection.ConnectionString = "provider=microsoft.jet.oledb.4.0;" & _
            "data source= " & "C:\AppDAO\Initialisation" & "\" & "init.mdb;"
     
            Connection.Open()
            ' rempli le dataset 
            AdaptTest.Fill(DtSet, "Test")
     
            'remplissage de la liste avec le dataset
            Dim Matable As DataTable
            Matable = DtSet.Tables("Test")
     
            drCurrent = Matable.Rows(0)
            drCurrent.BeginEdit()
            drCurrent("IEB-Facteur X") = 23
            drCurrent("IEB-Nom groupe") = "Coucou"
            drCurrent.EndEdit()
            Dim CmdBuild As OleDbCommandBuilder
            CmdBuild = New OleDb.OleDbCommandBuilder(AdaptTest)
            AdaptTest.UpdateCommand = CmdBuild.GetUpdateCommand()
            AdaptTest.Update(DtSet, "Test")
            Connection.Close()
     
        End Sub

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par rlapt Voir le message
    Visiblement lorsque l'on espionne la requête Update générée, on comprend pourquoi cela ne focntionne pas ; les deux mises à jour sont remplacée par des "?".
    Ceci est normal car les requêtes générées sont des requêtes paramétrées et les ? seront remplacé par les valeurs contenue dans les paramétrés.

    Pourrais-tu nous montrer la requête générée?

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Le code me parait correct.

    Est-ce que la table Test possède une clé primaire ?

    Remarque : si on modifie une eule row à la fois les instructions beginedit() et endedit() ne servent à rien.

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Est-ce que la table Test possède une clé primaire ?
    J'y avait pensé mais quand il n'y en a pas, le code plante au niveau de CmdBuild.GetUpdateCommand() avec un message explicite car il n'arrive pas à créer la requête.

    @rlapt : Si c'est une base de test pourriez-vous nous la donner afin que nous puissions mieux comprendre?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    Tout d'abord merci de votre aide.

    Pour répondre à :

    Graffito => oui il y a bien une clé primaire.

    Sankasssss => on trouve la chaîne suivante dans AdaptTest.UpdateCommand

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE Test 
    SET IEB-Nom groupe = ?, IEB-Facteur X = ? 
    WHERE (
            ((? = 1 AND IEB-Groupe IS NULL) OR (IEB-Groupe = ?)) 
        AND ((? = 1 AND IEB-Nom bloc IS NULL) OR (IEB-Nom bloc = ?)) 
        AND ((? = 1 AND IEB-Nom groupe IS NULL) OR (IEB-Nom groupe = ?)) 
        AND ((? = 1 AND IEB-Ancien nom IS NULL) OR (IEB-Ancien nom = ?)) 
        AND ((? = 1 AND IEB-Facteur X IS NULL) OR (IEB-Facteur X = ?)) 
        AND ((? = 1 AND IEB-Facteur Y IS NULL) OR (IEB-Facteur Y = ?)) 
        AND ((? = 1 AND IEB-Facteur Z IS NULL) OR (IEB-Facteur Z = ?)) 
        AND ((? = 1 AND Index entrée IS NULL) OR (Index entrée = ?)) 
        AND (Index sortie = ?)
    )
    Je ne sais pas si c'est la requête dont se sert VB.Net pour remettre à jour la tabe, mais ça y ressemble. Je joins la structure de la table en fichier attaché PDF.

    Merci encore de votre aide.
    Images attachées Images attachées

  6. #6
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    En regardant la requête on comprend beaucoup mieux pourquoi cela ne fonctionne pas...
    Les champs de la base de donnée étant composés de plusieurs mots distincts la requête est mauvaise. Personnellement je nomme toujours mes champs en un seul mot ex : IEB-Nom bloc devrait plutôt être écrit comme ceci IEB-Nom_bloc. Pareil pour tous les autres champs.

    Je n'utilise pas les CommandBuilder mais cela m'étonne qu'il ne prenne pas en compte les mots composés

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut Fin de discussion
    Bonjour,

    Merci pour ces aides.

    Effectivement il semble que CommandBuilder ne supporte pas les espaces dans les noms de champs.

    Je viens de faire l'essai sans espace dans les noms de champs, le même code fonctionne.

    Merci encore

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut Résolution
    Bonjour,

    Par hasard j'ai trouvé la solution. Au moins pour ce qui concerne une liaison avec Access.

    Après avoir déclaré votre objet CommandBuilder, il faut rajouter QuotePrefix et QuoteSuffix avec des crochets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim CmdBuild As New OleDb.OleDbCommandBuilder(BDTabIni(NroCon).AdapBD)
            CmdBuild.QuotePrefix = "["
            CmdBuild.QuoteSuffix = "]"
    A ce moment là le problème disparait.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/01/2009, 21h56
  2. Mise à jour d'une base de données
    Par JeanMarc_T2k dans le forum Services
    Réponses: 1
    Dernier message: 01/02/2008, 23h48
  3. Réponses: 7
    Dernier message: 13/08/2007, 14h15
  4. probleme de virgule dans la mise à jour d'une base de donnée
    Par KAF dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/12/2005, 03h18
  5. mise à jour d'une base de données
    Par flo83 dans le forum ASP
    Réponses: 6
    Dernier message: 12/06/2005, 21h27

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