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 - Lire une table Microsoft Access avec linq [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Services à domicile

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut VB - Lire une table Microsoft Access avec linq
    Bonjour à tous,

    Comme je débute avec Visual Studio 2013 (version gratuite, merci à Microsoft) et en Visual Basic, il y a fort à parier que j'ai "oublié" pleins de trucs à faire .
    J'ai bien entendu une version toute légale de Microsoft Office 2013 incluant Microsoft Access (si, si sans rire) .
    Accessoirement je suis sous Windows 8 (et là pas merci du tout à Microsoft), mais à mon humble avis ça ne change rien au problème.

    J'ai une base Microsoft Access 2013 de nom "sagas.acdb" qui est incluse dans mon projet.
    Dans cette base, il y a une table de nom "Sagas" qui comporte deux champs:
    - "IndexSaga" de type long (numéroautomatique)
    - "NomSaga" de type string (texte court)

    J'essaye tout simplement de lire les trois enregistrements de cette table.
    J'ai donc généré le code ci-dessous qui, vous vous en doutez bien, ne fait pas exactement ce que j'en attendais
    En fait il semblerait que MesEnreg soit vide au moment de l'exécution
    Y-aurait-il une âme charitable qui pourrait m'aider à sortir de ma situation délicate et corriger quelque peu mon code déplorable?
    D'avance merci pour votre aide

    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
        Private Sub test_database()
            Dim MaBase As New SagasDataSet
            Dim MaSaga As String
            Dim MonIndex As Long
     
            Dim MesEnreg = From p
                           In MaBase.Sagas
                           Select p.NomSaga, p.IndexSaga
     
            For Each Pp In MesEnreg
                MaSaga = Pp.NomSaga
                MonIndex = Pp.IndexSaga
                MsgBox(MonIndex & " " & MaSaga)
            Next Pp
        End Sub

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Citation Envoyé par HULKHULK83 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Dim MaBase As New SagasDataSet
    Fournit quoi ? Entre autre un DataSet rempli (avec DataAdapter) ?
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Services à domicile

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Bonjour, et merci de réagir si rapidement

    En fait, je n'en sais strictement rien !

    Dans mon projet elle apparaît sous la forme suivante :
    Nom : AccessInclus.png
Affichages : 635
Taille : 16,8 Ko

    Et un maximum de code a été automatiquement généré.

    Tout a du être fait correctement (du côté de Microsoft bien sûr) reste que mon inculture prouve que je ne sais pas (encore) l'utiliser.

    Je souhaite passer par VB car le VBA (que je maîtrise parfaitement) est un peu trop "limité" pour ce que je compte faire.
    En VBA ça donne quelque chose du style suivant
    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
     
        Dim Db As dao.Database
        Dim MonEnreg As dao.Recordset
        Dim SQL As String
     
        'définition de la BD utilisée, c'est celle qui est courante.
        Set Db = CurrentDb
     
        'constitution de la requete
        SQL = "SELECT Sagas.IndexSaga, Sagas.NomSaga FROM Sagas;"
     
        'définition du recordset qui va contenir le resultat de la requete
        Set MonEnreg = Db.OpenRecordset(SQL)
     
       ' puis on lit enregistrement par enregistrement
    Surtout ne pas s'affoler pour le nombre de table, leurs noms ou autres.
    Seules les tables sagas et livres m'importent avec 3 enregistrements pour Sagas et 9 pour livres (3 livres par saga bien sûr)
    Il me suffit de lire les tables et effectuer des calculs statistiques sur ce qu'elles contiennent (essentiellement des textes en sanskrit)

    Et pour le code VBA complet (vérifié, ça marche correctement):
    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
    Public Sub Lecture_Sagas()
        Dim Db As dao.Database
        Dim MonEnreg As dao.Recordset
        Dim SQL As String
     
        Set Db = CurrentDb
        SQL = "SELECT Sagas.IndexSaga, Sagas.NomSaga FROM Sagas ORDER BY Sagas.NomSaga;"
        Set MonEnreg = Db.OpenRecordset(SQL)
        While Not MonEnreg.EOF
            DoEvents
            MsgBox MonEnreg.Fields("IndexSaga").Value & " - " & MonEnreg.Fields("NomSaga").Value
            MonEnreg.MoveNext
        Wend
        MonEnreg.Close
        Set MonEnreg = Nothing
        Db.Close
    End Sub

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Si tu génères avec l'assistant puis pose le dataset sur le form, tu as directement le dataSet, le DataAdapter, datagridview ( et d'autres contrôles) sur ton form et en dessous.
    Il te rajoute cette ligne dans le formLoad (exemple avec une table personnes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            'TODO: cette ligne de code charge les données dans la table 'PersonnesDataSet.Personnes'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
            Me.PersonnesTableAdapter.Fill(Me.PersonnesDataSet.Personnes)
    et tu peux faire directement ta requête sql linq
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub btnDataSetLink_Click(sender As System.Object, e As System.EventArgs) Handles btnDataSetLinq.Click
            For Each Pers In From p In PersonnesDataSet.Personnes Select p.NamePers, p.PersonId
                MessageBox.Show(Pers.NamePers & " " & Pers.PersonId)
            Next Pers
        End Sub

    Si tu veux accéder plus directement par code
    Avec une classe représentant les données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class pers
        Property id As Integer
        Property nom As String
        Sub New(i As Integer, n As String)
            id = i
            nom = n
        End Sub
    End Class
    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
        Private Sub btnDirect_Click(sender As System.Object, e As System.EventArgs) Handles btnDirect.Click
            Dim lp As List(Of pers) = New List(Of pers)
            Dim MaRequete As String = "SELECT personid, namepers FROM personnes"
            Dim MaCnx As String = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source =d:\data\personnes\personnes.accdb"
            Using cn As New OleDbConnection(MaCnx), cmd As New OleDbCommand(MaRequete, cn)
                Try
                    cn.Open()
                    Using reader As OleDbDataReader = cmd.ExecuteReader()
                        If reader.HasRows Then
                            Do While reader.Read()
                                lp.Add(New pers(reader.GetInt32(0), reader.GetString(1)))
                            Loop
                        Else
                            MessageBox.Show("Pas de lignes trouvées.")
                        End If
                    End Using
                Catch ex As Exception
                    MessageBox.Show(ex.ToString)
                End Try
            End Using
            For Each Pers In From p In lp Select p.id, p.nom
                MessageBox.Show(Pers.id & " " & Pers.nom)
            Next Pers
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Services à domicile

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Et c'était si simple
    Comment dire ?

    C'est tout simplement parfait !

    Merci beaucoup

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Services à domicile

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Et voilà le code résultat
    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
     
        Public Class Saga
            Property IndexSaga As Long
            Property NomSaga As String
            Sub New(i As Long, n As String)
                IndexSaga = i
                NomSaga = n
            End Sub
        End Class
     
        Public Sub RécupèreLesSagas()
            Dim MesSagas As List(Of saga) = New List(Of saga)
            Dim MaRequete As String = "SELECT IndexSaga, NomSaga FROM Sagas"
            Dim MaCnx As String = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source =C:\Users\Alain\Desktop\Maharabata\@DATA\Sagas.accdb"
            Using cn As New System.Data.OleDb.OleDbConnection(MaCnx), cmd As New System.Data.OleDb.OleDbCommand(MaRequete, cn)
                Try
                    cn.Open()
                    Using reader As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()
                        If reader.HasRows Then
                            Do While reader.Read()
                                MesSagas.Add(New Saga(reader.GetInt32(0), reader.GetString(1)))
                            Loop
                        Else
                            MessageBox.Show("Pas de lignes trouvées.")
                        End If
                    End Using
                Catch ex As Exception
                    MessageBox.Show(ex.ToString)
                End Try
            End Using
            For Each MaSaga In From p In MesSagas Select p.IndexSaga, p.NomSaga
                MessageBox.Show(MaSaga.IndexSaga & " " & MaSaga.NomSaga)
            Next MaSaga
        End Sub

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

Discussions similaires

  1. Mise à jour d'une table dans access avec un dataset
    Par San Soussy dans le forum ADO.NET
    Réponses: 2
    Dernier message: 15/04/2014, 11h56
  2. [Débutant] Comment afficher ligne x colonne Y d'une table dans access avec vs2012
    Par JetLibre dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/08/2013, 22h23
  3. lire une table Access avec VBA
    Par ivoratparis dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/06/2013, 16h56
  4. Creation d'une table dans ACCESS avec le composant TADOTABLE ?
    Par QAYS dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/10/2008, 17h39
  5. Réponses: 11
    Dernier message: 20/03/2007, 00h13

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