-1
votes

Vb.net comment faire correctement boucle via un ensemble de résultats

J'ai regardé de nombreux extraits de code différents sur ce site à la recherche de cela me montrerait comment faire quelque chose qui devrait être assez simple une fois que j'ai la connaissance.

Je veux interroger une table de base de données pour une gamme de valeurs et Puis remplissez une combinaison avec ces résultats.

Voici ce que j'ai jusqu'à présent: xxx


4 commentaires

Créez The DataTable avec mysqldataaadapter.frillez et Assigner sur Combobox.


@Gserg, merci pour la poussée dans la bonne direction. Je vais lire les liens maintenant. Merci encore! Question: L'utilisation de la méthode de remplissage ne nécessite pas d'avoir une table sur le formulaire, n'est-ce pas?


Généralement, nous utiliserions la base de données au lieu de boucler à travers le résultat.


@ Joelcoehoorn, merci Joel, je suis très perdu avec cette langue, donc j'ai besoin de continuer à lire. Je ne sais pas quelle est la base de données, mais je vais le chercher. Merci pour le conseil.


3 Réponses :


0
votes

Si vous voulez juste que le nom Machinename soit affiché dans le ComboBox, utilisez-le, utilisez simplement cela comme affichage; Ne vous inquiétez pas de créer une autre colonne appelée texte.

Public Sub getMachines()
    Try
        Dim cmd As String = "SELECT MachineName from machine"
        Dim ds As New DataSet()
        Using con As New MySqlConnection(ConnectionString)
            Using da As New MySqlDataAdapter(cmd, con)
                da.Fill(ds)
                With Form1.machineName
                    .DisplayMember = "MachineName"
                    .ValueMember = "MachineName"
                    .DataSource = ds
                End With
            End Using
        End Using
    Catch ex As MySqlException
        MsgBox(ex.Message)
    End Try
End Sub


5 commentaires

Merci DJV. J'ai essayé votre extrait de code et ce que je vois dans la combinaison est: system.data.dataviewManagerListitemTeScriptor. Cela ne fonctionne pas comme prévu.


En outre, j'ai remarqué qu'il n'y a pas de boucle. Il ne faut-il pas y avoir une boucle pour gérer chaque valeur qu'il trouve dans la base de données?


@Nan c'est un peu le point de liaison de données. Il pointe le contrôle à une liste de données. Il vous suffit de le faire savoir quel champ sera utilisé pour l'affichage. Désolé ça ne fonctionne pas. Je l'ai traduits de cette réponse . Personnellement, j'utiliserais une sorte d'ormes comme ef Parce que beaucoup de ce travail se feront déjà pour vous.


@Nan Check Out Cette réponse qui indique qu'il existe un bug étrange qui a à voir avec l'ordre dans lequel l'affichage et Le Datasoruce est défini. J'ai changé ma réponse en échangeant la commande. Essayez ça.


Bonjour DJV, et merci pour l'aide. J'ai essayé votre édition mais je n'ai rien retourné à la combinaison, c'est vide. Merci d'avoir souligné la liaison de données et comment cela peut m'aider. Je pense qu'à ce stade, je vais regarder dans cette direction.



0
votes

Je montrerai quelques exemples, y compris en utilisant des paramètres, car cela est important.

Tout d'abord, une traduction rapide pour exécuter la requête existante et la boucle dans les résultats: P>

Private Iterator Function GetMachines(ByVal machineFilter As String) As IEnumerable(Of String)
    Dim SQL As String = "SELECT MachineName from machine WHERE MachineName LIKE @Filter"

    Using cn As New MySqlConnection(ConnectionString), _
          cmd As New MySqlCommand(SQL, cn)

        'Match the MySqlDbType to your actual database column type and length
        cmd.Parameters.Add("@Filter", MySqlDbType.VarString, 30).Value = machineFilter
        cn.Open()
        Using rdr As MySqlDatareader = cmd.ExecuteReader
            While rdr.Read()
                Dim result As String = rdr("MachineName")
                Yield Return result
            End While
        End Using
   End Using
   Return result
End Function

Private Function GetMachines() As IEnumerable(Of String)
    Return GetMachines("%")
End Function


4 commentaires

Merci Joel, c'est très utile pour comprendre comment les choses devraient être faites. Encore merci. Je vais regarder ça maintenant.


Joel, avant de partir pour la journée, je voulais vous faire savoir que j'ai essayé votre extrait de diffusion de base de données. Si je vais apprendre cette langue, je pourrais aussi bien apprendre les meilleures pratiques, car vous sortez. En ce qui concerne les blocs try / attraper, je sais mieux que de les utiliser dans un modèle. Merci d'avoir souligné mon erreur. Je ne suis pas sûr de savoir pourquoi, mais votre extrait de base de données pose cela dans le ComboBox au lieu de la valeur que je m'attends à: System.Data.DataviewManagerListitemTeSpedScriptor. J'ouvre également ce même comportement exact avec le code de DJV ci-dessus.


Vous aurez peut-être besoin d'un appel "ToString ()", ou similaire. Essayez mon dernier exemple, qui gère la conversion Object => String dans la méthode des données.


Wow, Joel, merci beaucoup d'avoir pris autant de temps pour expliquer cela! Vous êtes allé dessus, merci! J'ai essayé votre dernier édition mais je n'ai pas pu le faire fonctionner. J'ai toutefois reçu beaucoup d'informations de chacun de vos exemples. Je connais la bonne façon de coder quelque chose comme ça dans une langue que je connais, mais avec vb.net, j'ai du mal à ramper. C'est à dire, merci d'avoir expliqué les choses!



0
votes

J'ai procédé beaucoup comme vous l'avez fait. J'ai utilisé la méthode de charge du jeu de données. Il n'est pas nécessaire de définir le nom de la colonne et le type. Le nom de la colonne est extrait de l'instruction SELECT et le type de données est déduit par ADO.net à partir des premiers enregistrements.

Heureusement, un jeu de données peut être un énumérable à l'aide de la méthode .asenumnérable. Ensuite, nous pouvons utiliser LINQ pour obtenir toutes les valeurs de la colonne Machinename. Appeler .totarray provoque l'exécution de Linq. Si vous maintenez votre curseur sur les noms sur cette ligne, vous verrez que le type de données est la chaîne (). Juste ce dont nous avons besoin pour remplir une boîte déroulante.

code pour une classe appelée dataAccess xxx

dans le formulaire charge de la boîte combebo comme ceci. xxx


1 commentaires

À la fin de la journée, c'est ce qui a fonctionné pour moi, merci, Mary! Ce que j'essayais de faire était de faire une seule dataaccess, ou du Dalbal que je puisse réutiliser dans d'autres projets. J'aimerais avoir une classe de squelette que je puisse simplement laisser tomber dans d'autres projets, la chaîne de connexion étant la seule chose qui doit changer. Est-ce possible ou je vais devoir écrire une connexion pour chaque processus que je code?