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 :

Problème combobox et base de données


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Par défaut Problème combobox et base de données
    Voila, je suis en train de développer une fonction qui remplie un combobox à partir d'une requête SQL.
    Sauf que lorsque je l'exécute j'ai un message d'erreur "ExecuteReader: la propriété connexion n'a pas été initialisé" du cou, mon combobox ne se remplie pas.
    Voici l'exemple de mon code

    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
        Public Function ChargeCombo(ByVal combobox As ComboBox, ByVal req As String)
     
            Try
                'Instanciation de la connexion
                ObjetConnection = New OleDbConnection
     
                'On donne les valeurs à la connexion
                ObjetConnection.ConnectionString = strConn
     
                'Instanciation d'un objet Commande
                ObjetCommand = New OleDbCommand(req)
     
                'On ouvre la connexion
                ObjetConnection.Open()
     
                'Instanciation d'un objet datareader
                ObjetDatareader = ObjetCommand.ExecuteReader
     
                ' On vide le ComboBox 
                combobox.Items.Clear()
     
                If ObjetDatareader.HasRows Then
                    ' tant que le DataReader a une ligne d'enregistrements
                    While ObjetDatareader.Read
                        ' ajouter la donnée au ComboBox 
                        combobox.Items.Add(ObjetDatareader.GetValue(0))
                    End While
                Else
                    MessageBox.Show("Il n'y a pas de données", "Infos", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                If Not (ObjetDatareader Is Nothing) Then ObjetDatareader.Close()
                If Not (ObjetConnection Is Nothing) Then ObjetConnection.Close()
            End Try
            Return ComboBox
        End Function
    De plus, j'aimerais savoir si on est obligé d'utiliser un datareader et pas un dataset et aussi j'aimerais a partir de la même requête pouvoir compléter des textbox en fonction de mon combobox.
    En gros, si dans ma table j'ai les colonnes nom et prénom, que mon combobox contient les noms, j'aimerais qu'en changeant le dans le combobox que le prénom change automatiquement dans le textbox.

    D'avance merci pour l'aide que vous pourrez m'apporter

    @++
    dubidon

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    Tout d'abord ton code est incomplet:
    - on ne voit pas le contenu du strConn (string connection)
    - de la requete SQL (req).

    Pour allez plus loin je t'invite à voir ce lien sur les databases et autres infos VBnet Cours VbNet

    Une mine d'info

  3. #3
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    Citation Envoyé par dubidon
    De plus, j'aimerais savoir si on est obligé d'utiliser un datareader et pas un dataset
    c'est comme tu veux.
    Comme tu dois le savoir, le DataSet te permet d'être en mode déconnecté alors qu'avec le DataReader tu restes connecté.
    Tout dépend de ton besoin.
    Moi j'utilise plus souvent des DataSet que des DataReader.
    Par contre, je ne trouve pas ton raisonnement très objet. Tu ne viendrais pas d'un langage procédural par hasard ?

    Je te conseilles plutôt de développer une classe Personne (désolé c'est du c#):

    Code c# : 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
    public class Personne
    {
        private string m_Nom;
        public string Nom
        {
             get{ return m_Nom;}
             set{
                  if (m_Nom != value)
                        m_Nom = value;}
        }
     
        private string m_Prenom;
        public string Prenom
        {
             get{ return m_Prenom;}
             set{
                  if (m_Prenom!= value)
                        m_Prenom= value;}
        }
     
        public Personne(string nom, string prenom)
        {
             m_Nom = nom;
     
             m_Prenom = prenom;
        }
    }

    Ensuite lorsque tu récupères la liste des personne, tu instancie pour chaque personne la classe personne et tu les ajoutes dans une liste de type List<Personne>.
    Après, il est très facile d'ajouter les éléments de ta liste à ton ComboBox, soit manuellement, soit en utilisant le DataBinding.

    Pour ta deuxième question, si tu utilises des objets persos comme la classe Personne, tu devrais pouvoir retrouver la personne sélectionné et ensuite mettre à jour le TextBox.
    Si tu utilises un DataSet, tu peux très facilement, à l'aide d'un BindingSource mettre à jour automatiquement le TextBox suivant la sélection du nom dans le ComboBox.

    A bientôt
    Bye

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Par défaut
    merci a vous pour ces réponses, j'ai pas mis ma requete et ma connexion car ces valeurs sont valables et fonctionnels puisque testé avec un datagrid.

    Pour l'utilisation de classe, c'est vrai que je suis habitué a travailler en procédural et j'ai énormément de mal à me faire à la programmation objet sous vb.net
    Dès que j'aurais mon projet avec moi je vais regarder tout cela

    encore merci pour vos réponses

    @++
    dubidon

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Par défaut
    voila, j'essaie absolument de mettre mes données contenues dans un datatable dans un combobox, mais je n'y arrive pas.
    J'ai bien essayer d'adapter ce code destiné au listbox, et même de remplacer mon combobox par un listbox, mais çà ne fonctionne pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Remplir une Listbox ligne par ligne
     
    Dim matable As New DataTable
     
    matable = ObjetDataSet.Tables("FICHEPATIENT")
     
    Dim Ligne As DataRow()
     
    For Each Ligne In Matable.Rows
     
              List1.Items.Add(ligne.Item(" Nom "))
     
    Next
    du cou je commence un peu à déseperer là, déja qu'il ne connais pas le ligne.item, j'ai essayer de passer outre en utilisant "table.Rows.Item(column)"
    mais j'ai toujorus un probleme qui empeche ce code de focntionner corecttement, au niveau du "For Each Ligne In table.Rows", il me sort ce message d'erreur :

    Impossible d'effectuer un cast d'un objet de type 'System.Data.DataRow' en type 'System.Data.DataRow[]'.

    quelqu'un pourrait t'il eclairer ma lanterne, qui ne brille pas fort là

    d'avance merci

    @++
    dubidon

  6. #6
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    avec le DataTable c'est assez facile. Il faut utiliser le DataBinding.

    Exemple avec un ListBox:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyListBox.DataSource = ObjetDataSet.Tables("FICHEPATIENT")
    MyListBox.DisplayMember = "Nom"

    Et voilà. Tu peux faire la même chose avec un ComboBox.

    N'hésite pas à poser des questions.

    Bye

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Par défaut
    merci pour ces quelques lignes, j'ai bien retranscrit ce que tu me dis pour une listbox, mais rien ne se passe, j'ai déjà l'avantage de n'avoir aucun message d'erreur, mais rien ne se charge dans la listbox

    voici quand même le code complet

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
        ' Déclaration Objet Connection
        Private ObjetConnection As OleDbConnection
     
        ' Déclaration Objet Commande
        Private ObjetCommand As OleDbCommand
     
        ' Déclaration Objet DataAdapter
        Private ObjetDataAdapter As OleDbDataAdapter
     
        ' Déclaration Objet DataSet
        Private ObjetDataSet As New DataSet
     
        ' Déclaration Objet DataTable
        Private ObjetDataTable As New DataTable
     
        ' Déclaration objet DataReader
        Dim ObjetDatareader As OleDbDataReader = Nothing
     
        'Paramêtres de connexion à la DB
        Private strConn As String = "Data Source=****\SQLEXPRESS;Provider=SQLOLEDB;Initial Catalog=DBabcdom;Persist Security Info=True;User ID=**;Password=*******"
     
        ' Déclaration d'un  OleDbCommandBuilder
        Private ObjetCB As OleDbCommandBuilder
     
     
     
        Public Function ExecReq(ByVal req As String, ByVal table As String, ByVal colonne As String)
            Dim list1 As New ListBox
     
            'on vide le dataset 
            ObjetDataSet.Clear()
            'Instanciation d'un Objet Connexion
            ObjetConnection = New OleDbConnection
            'Donner à la propriété ConnectionString les paramètres de connexion
            ObjetConnection.ConnectionString = strConn
            'Ouvrir la connexion
            ObjetConnection.Open()
            'Instancier un objet Commande
            ObjetCommand = New OleDbCommand(req)
            'Instancier un objet Adapter
            ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
            'initialiser l'objet Command
            ObjetCommand.Connection() = ObjetConnection
            'initialiser l'objet OleCBComandBuilder (sinon pas d'update)
            ObjetCB = New OleDbCommandBuilder(ObjetDataAdapter)
            'Avec l'aide de la propriété Fill du DataAdapter charger le DataSet
            ObjetDataAdapter.Fill(ObjetDataSet, table)
            'Créer une datatable à partir du dataset
            ObjetDataTable = ObjetDataSet.Tables(table)
     
     
            list1.DataSource = ObjetDataSet.Tables(table)
            list1.DisplayMember = colonne
     
            Return list1
     
        End Function
    voila le code qui fait appel a la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            strSql = "SELECT * FROM BENEFICIAIRES"
            table = "BENEFICIAIRES"
            ListBox1 = BD.ExecReq(strSql, table, "NomBeneficiaire")
    d'avance merci pour votre aide et votre patience

    @++
    dubidon

  8. #8
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Si rien ne s'affiche, cela peut-être dû au fait que la liaison de ta DataTable n'est pas faite correctement.

    Vérifie avec le debugger que la DataTable est bien lié à ton listBox.

    Courage, ça va marcher.
    Bye

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 189
    Par défaut
    j'ai bien vérifier avec le débogueur est ma datatable est bien lié à ma listbox, mais par contre est ce que le fait que je remplisse une listbox " fictive" et que j'affecte cette listbox a celle qui existe vraiment sur ma forme ne cause pas un problème ???

    merci

    @++
    dubidon

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

Discussions similaires

  1. Problème pour attacher base de données
    Par bpoulain dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/03/2006, 12h40
  2. [VBA-E]COMBOBOX, et base de données
    Par legend dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/02/2006, 13h22
  3. problème avec ma base de donnée
    Par polace dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 22/10/2005, 22h26
  4. problème avec ma base de données
    Par pmboutteau dans le forum ASP
    Réponses: 6
    Dernier message: 25/02/2005, 12h59
  5. Problême d'ouverture base de données
    Par comment_ca dans le forum Oracle
    Réponses: 20
    Dernier message: 14/12/2004, 12h39

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