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 :

[vb.net 2010] Datagridview + BD access => problème


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 24
    Points
    24
    Par défaut [vb.net 2010] Datagridview + BD access => problème
    Bonjour à tous,

    Je viens vers vous car j'ai épuisé mon stock de bidouillage en tout genre et pour finir, je m'y perds complètement.

    Voilà mon problème :

    J'ai une BD access avec 2 tables (entre autre).

    Ma première table (tâche) utilise un identifiant de la seconde table (personne) pour savoir qui a encodé la tâche.

    Ma requête utilise donc une jointure, pas de soucis là dessus.

    Si j'ai bien compris la logique (et reprenez moi si je me trompe) pour afficher les résultats de la requête dans une datagridview, il faut :

    Créer un dataadapter
    Créer un dataset
    Créer un datatable qui a la structure du résultat de ma requête
    Ajouter ce datatable au dataset
    Faire un fill du dataadapter vers la table du dataset
    Spécifier le datasource du datagridview comme étant le datatable

    Là niveau code ça coince j'ai déjà essayé plusieurs combinaisons et j'ai tjrs mon datagrid qui n'affiche rien

    A Plus long terme il faudrait aussi que je puisse ajouter un nouveau record (row), supprimer, et mettre à jour.

    J'ai déjà lu et relu la doc Philippe Lasserre et rien n'y fait

    Pour infos je suis donc en vb.net sous visual studio 2010 ultimate (framework 4 donc).

    D'avance merci.

  2. #2
    Membre habitué Avatar de sihammaster
    Webmaster
    Inscrit en
    Mai 2009
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Webmaster
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 256
    Points : 183
    Points
    183
    Par défaut
    Bonjour,
    Si tu peux nous ecrire ton code pour bien voir le probleme.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    ok mais à force de changer je doute que ca veuille dire quelque chose encore..

    mais bon, voilà :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    ObjetConnection = New OleDbConnection()
            ObjetConnection.ConnectionString = ChaineConnec
     
            ObjetConnection.Open()
     
            ObjetCommand = New OleDbCommand("SELECT tache.dateeve, tache.tache, tache.demandeur, utilisateur.id, utilisateur.nom FROM tache, utilisateurs WHERE tache.encodeur = utilisateurs.id")
     
            ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
     
            ObjetCommand.Connection() = ObjetConnection
            ObjetDataTable = New DataTable("reqTache")
            Dim colonne As DataColumn
     
            colonne = New DataColumn()
            colonne.DataType = System.Type.GetType("System.DateTime")    
            colonne.ColumnName = "dateeve"
            ObjetDataTable.Columns.Add(colonne)
     
            colonne = New DataColumn()
            colonne.DataType = System.Type.GetType("System.String")   
            colonne.ColumnName = "tache"
            ObjetDataTable.Columns.Add(colonne)
     
            colonne = New DataColumn()
            colonne.DataType = System.Type.GetType("System.String") 
            colonne.ColumnName = "demandeur"
            ObjetDataTable.Columns.Add(colonne)
     
            colonne = New DataColumn()
            colonne.DataType = System.Type.GetType("System.Integer")
            colonne.ColumnName = "userId"
            ObjetDataTable.Columns.Add(colonne)
     
            colonne = New DataColumn()
            colonne.DataType = System.Type.GetType("System.String") 
            colonne.ColumnName = "userNom"
            ObjetDataTable.Columns.Add(colonne)
     
            ObjetDataSet.Tables.Add(ObjetDataTable)
     
    ObjetDataAdapter.Fill(ObjetDataSet, "reqTache")
     
    BindingSource1.DataSource = ObjetDataTable
            DataGridView1.DataSource = BindingSource1
            BindingNavigator1.BindingSource = BindingSource1
    Voilà, ça ne doit surement pas être bon.

    Merci d'avance.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Je suis encore sous le coup de la digestion mais il manque, entre la datatable et le datagridview, une binding source.

    Autrement je vous conseille d'utiliser VisualStudio et la partie Source de donnée pour définir ta table access en tant que source de donnée.

    Ainsi le code créant le dataset, les datatables, les tableadapter seront générés automatiquement. Encore mieux normalement dans la fenetre source de donnée, vous verrez apparaitre vos tables dans la base de donnée avec la possiblité de les glisser directement dans votre formulaire sous en tant que controle. Et là l'IDE créera automatiquement les objet nécessaires pour gérer l'opération.

    Une fois le résultat optenu (sous la forme d'un prototype fonctionnel), je vous recommande fortement d'étudier les objets et le code généré par Visual Studio afin de comprendre ce qui a été générée. Vous pourrez ainsi ensuite croiser vos nouvelles connaissances avec la doc Philippe Lasserre et la doc MSDN afin de pousser plus loin l'utilisation du datagridview (qui est un controle relativement complexe).

  5. #5
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Je ne voudrait pas contredire mon prédécesseur, mais j'ai un autre avis.

    Utiliser le designer pour ajouter des sources de données, ça peut sembler sympa, mais en code c'est pas grand chose a faire, et quand une erreur survient, il est impossible de la réparer, vu que le code est auto générer.

    (Par exemple, si dans une table de ta BDD, tu modifie une colonne, c'est la catastrophe, il faut tout recommencer).

    Ensuite le binding source n'est pas obligatoire.

    Dans ton code, tu ajoutes manuellement des colonnes a ta datatable, or ce n'est aps nécessaire. Le dataadapter va te les créers.

    Ton erreur viens je pense dans l'indication de la connexion a utiliser.

    Si je reprends ton code, ca donnerai ca:

    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
    ObjetConnection = New OleDbConnection()
            ObjetConnection.ConnectionString = ChaineConnec
     
            ObjetConnection.Open()
            'Ligne de code modifier au bout
            ObjetCommand = New OleDbCommand("SELECT tache.dateeve, tache.tache, tache.demandeur, utilisateur.id, utilisateur.nom FROM tache, utilisateurs WHERE tache.encodeur = utilisateurs.id", ObjetConnection)
     
            ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
     
            ObjetDataTable = New DataTable("reqTache")
     
            ObjetDataSet.Tables.Add(ObjetDataTable)
     
            ObjetDataAdapter.Fill(ObjetDataSet, "reqTache")
     
            DataGridView1.DataSource = ObjetDataSet.Tables("reqTache")
     
            'Ne pas oublier de fermer la connection
            ObjetConnection.Close()

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2008
    Messages : 161
    Points : 166
    Points
    166
    Par défaut
    Essaie de voir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      Dim ObjetConnection As New OleDb.OleDbConnection(ChaineConnec)
     
            'Remplissage du DataGrid
            Dim ObjetDataSet As DataSet = New DataSet
            Dim ObjetDataAdapter As OleDb.OleDbDataAdapter
            Dim LaRequete As String = "SELECT tache.dateeve, tache.tache, tache.demandeur, utilisateur.id, utilisateur.nom FROM tache, utilisateurs WHERE tache.encodeur = utilisateurs.id"
     
            ObjetConnection.Open()
     
            ObjetDataAdapter = New OleDb.OleDbDataAdapter(LaRequete, ObjetConnection)
            ObjetDataAdapter.Fill(ObjetDataSet, "tache, utilisateurs")
            DataGridView1.DataSource = ObjetDataSet.Tables("tache, utilisateurs").DefaultView
     
            ObjetConnection.Close()

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    merci beaucoup pour vos réponses !

    Je test ça demain, pas le temps aujourd'hui et je post le résultat pour aider si d'autres ont le même problème.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    @ mactwist69

    cela ne fonctionne pas en adaptant mon code suite à tes explications (j'ai le même code que toi maintenant)

    pas encore essayé peregna2007

    edit : voilà essayé le code de peregna2007 et pas mieux, ma datagridview est toujours grise avec rien dedans !

  9. #9
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    2 Suggestions:

    1) As tu essayé ta requetes dans un Query Browser ?
    Parce que j'avais pas fais gaffe, mais deja ta requete n'est pas correctement ecrite... au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT tache.dateeve, tache.tache, tache.demandeur, utilisateur.id, utilisateur.nom FROM tache, utilisateurs WHERE tache.encodeur = utilisateurs.id"
    Ca devrait utiliser une jointure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT t.dateeve, t.tache, t.demandeur, u.id, u.nom FROM tache t INNER JOIN utilisateurs u ON t.encodeur = u.id"
    2) Si tu fais au pas a pas... est ce qu'un exception est levé, sinon, la datatable contient elle quelque chose ?

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2008
    Messages : 161
    Points : 166
    Points
    166
    Par défaut
    jojo1284,

    c'est vrai qu'on essaie de trouver une solution à ton problème. Mais nous sommes allé sur la base que ta requête fonctionne bien et qu'elle contient effectivement de données.

    En suivant la suggestion(2) de mactwist69, il faudrait que tu te rassures que en exécutant simplement ta requête, tu obtiens des données. C'est seulement dans ce cas que tu peux obtenir des données dans ton GridView. Sinon il sera vide, sans donné.

    Fait le test de ta requête et fais nous un retour.

  11. #11
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut utiliser dataset
    bonjour
    pour resumer et retenir les etapes voici d'abord les regles concernant lutilisation d 'un dataset ,adapter ,commande ,instruction SQL & chaine de connexion à une bd existante:
    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
    36
    37
    38
    39
    40
    41
    42
     
        '---------------------------Etape n°1--------------------------------------
            'Declarer les Variables de travail
            '1/declarer une variable chaine pour la chaine de connexion
            '2/declarer une var connexion pour contenir une connexion
            '3/declarer une var chaine pour l'instruction SQL (selection des champs à rapatrier d'une table de la BD)
            '4/declarer une var commande pour executer instruction SQL
            '5/declarer un  var adapter pour contenir un Adapter
            '5/declarer un  var dataSet pour contenir un DataSet
            Dim objConStr As String
            Dim objCon As OleDbConnection
            Dim objStrSQL As String
            Dim objCommand As OleDbCommand
            Dim objAdapter As OleDbDataAdapter
            Dim objDataSet As DataSet
            '---------------------------Etape n°2--------------------------------------
            'Initialiser les Variables de travail
            '1/ var chaine de connexion
            objConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DossierBD\Personnel.mdb"
            '2/var connexion
            objCon = New OleDbConnection(objConStr)
            '3/var instruction SQL
            objStrSQL = "SELECT * From TablePersonnel1"
            '4/var commande
            objCommand = New OleDbCommand(objStrSQL)
            '3/var adapter
            objAdapter = New OleDbDataAdapter(objCommand)
            '4/var dataset 
            objDataSet = New DataSet
            '---------------------------Etape n°3--------------------------------------
            'Charger la table "TablePersonnel1" en memoire  du dataset
            'cette table est charge à l'index=0 du dataset(important pour datamember du datagridview)
            objAdapter.Fill(objDataSet)
            '---------------------------Etape n°4--------------------------------------
            ' visualiser la table avec datagridview
            DataGridView1.DataSource = objDataSet
            DataGridView1.DataMember = objDataSet.Tables(0).TableName
     
            'A memoriser scrupuleusement(il faut les repeter)
            '"dans la repetion,il y un gain " proverbe arabe. 
           'mise à jour BD(les modifs faites ne sont pas perdues
            objAdapter.Update(objDataSet)
    A memoriser scrupuleusement(il faut les repeter)
    '"dans la repetion,il y a un gain " proverbe arabe.

    maintenant une petite remarque concernant datacolumn,creation des colonnes etc.....
    ce code est utile pour quelque qui cree une table en memoire (elle n'existe dans la bd) comme quelqu'un qui cree un tableau en memoire il fait dim.
    quand tu quitte ton application ,cette table c'est itou elle n'existe plus comme un tableau ou tout autre variable....................

    L'interet du dataset est une espece d'un tableau en memoire (copie fidele de la table)pour manipuler les donnees de la table(les modifier,ajouter un enreigistement...etc..
    Sauf ,sauf Eh oui .....qu'il permet (a la difference d'un simple tableau) de reecrire les modifs dans la table BD à l'aide de son compagnon adapter
    en effet apres modif on peut ecrire objAdater.Update(objDataSet).
    Ce qui prouve son utilite et la necessite de respecter ses regles....
    bon code.................

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Alors,.... pas taper

    En effet, le problème était bien dans la requête : oubli d'un s dans le nom d'une table...

    La requête me semblait tellement basique que pour moi, elle était bonne (oui sauf l'oubli du "s" dans le nom de la table)

    Pour ce qui est de la jointure, c'est bien le WHERE dans ma requête (je n'aime pas les inner join).

    J'aurais tout de même pensé que la requête allait lever une erreur en exécution suite à une jointure sur une table qui n'existe pas... bin non.

    Enfin, merci pour ce petit rappel MABROUKI

  13. #13
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Concernant le inner join, ici :
    http://mysql.developpez.com/faq/?page=SYNTAXE_JOINTURES

    Ca dit:

    Pour faire une jointure entre 2 tables, est-il préférable de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM tableA, tableB
    	 WHERE tableA.refB = tableB.id ;
    ou bien cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM tableA
     INNER JOIN tableB
      ON tableA.refB = tableB.id ;
    ?

    De nombreuses personnes choisiront la solution avec le WHERE parce que "c'est moins long à écrire". Ceci n'est pas une raison suffisante !


    Il vaut mieux utiliser le INNER JOIN pour les raisons suivantes :

    C'est une jointure que vous souhaitez faire, pas un produit cartésien

    Avec le INNER JOIN, on voit très clairement comment sont faites les jointures

    Le type de jointure (INNER, LEFT OUTER...) apparait de manière explicite

    Le INNER JOIN est beaucoup plus propre: on fait très clairement la différence entre les conditions de jointures (dans le ON) et les conditions de restriction (dans le WHERE)

    Cette clarté permet une meilleure localisation des bugs (en particulier sur des requêtes faisant intervenir plusieurs jointures)

    Pour effectuer certaines optimisations , le SGBD se base sur les jointures. Si à la place vous utilisez un produit cartésien, aucune optimisation ne sera effectuée

    Il faut donc utiliser le INNER JOIN et adopter une indentation permettant une lecture facile de la requête SQL (nombreux sauts de lignes).

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/03/2013, 16h36
  2. vb.net 2010 + access => requête sur champ date/time
    Par jojo1284 dans le forum VB.NET
    Réponses: 18
    Dernier message: 09/05/2012, 17h46
  3. [CR 2008] Problème avec CrystalReport et vb.net 2010
    Par zilien974 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 05/10/2011, 16h03
  4. VB 2010 express => Datagridview et access
    Par jojo1284 dans le forum VB.NET
    Réponses: 12
    Dernier message: 29/04/2010, 17h40
  5. [Vb.net 2003] Access.Application / Problème de fermeture d'Access
    Par Perceneige dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/05/2007, 19h32

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