DropDown mit Daten aus MySQL DB füttern

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von samson.

    DropDown mit Daten aus MySQL DB füttern

    Moin Moin zusammen,

    ich steh wieder mal vor einer neuen Herausforderung...
    Eine MySql Verbindung und die dazugehörige Abfrage habe ich bereits...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Shared conn As New MySql.Data.MySqlClient.MySqlConnection
    3. Public Shared da As Common.DbDataAdapter
    4. Dim sql As String
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. sql = "SELECT * FROM ms_tel"
    7. abfrage_ausfuehren_start_form(sql)
    8. End Sub
    9. Public Shared Sub abfrage_ausfuehren_start_form(ByVal dieser_sql As String)
    10. Try
    11. conn.ConnectionString = myConnectionString
    12. conn.Open()
    13. da = New MySqlDataAdapter(dieser_sql, conn)
    14. Dim dt As New DataTable
    15. da.Fill(dt)
    16. Form1.anzahl_datensaetze.Text = dt.Rows.Count.ToString
    17. Form1.DataGridView1.DataSource = dt
    18. conn.Close()
    19. Catch ex As MySql.Data.MySqlClient.MySqlException
    20. MessageBox.Show(ex.Message)
    21. End Try
    22. End Sub
    23. End Class


    Mein Versuch beläuft sich momentan darauf...



    jedoch stelle ich mir eine Frage,... wie ich das realisiert bekomme...
    Ich habe in meiner Datenbank ein ID und ein Namen Feld...

    Beispiel:
    1 - Mustermann
    2 - Musterfrau
    3 - Meerschwein

    wie bekomme ich die in eine Dropdown-Box?
    ich möchte im endefekt den Namen angezeigt bekommen und nur die ID übergeben...
    Die Datagrid ausgabe funktioniert bis jetzt einwandfrei...

    Bisher sind alle versuche gescheitert, die ich per Google und co gefunden habe...
    In php/html bekomm ich das mit einem Array ja hin...

    HTML-Quellcode

    1. <select name="select" id="select">
    2. <option value="1">Mustermann</option>
    3. <option value="2">Musterfrau</option>
    4. <option value="3">Meerschwein</option>
    5. </select>


    Vielleicht kann mir von euch wer helfen... :)

    Danke und Grüße
    Stefan
    Nein! Doch! OHH!
    Du kannst eine Combobox nehmen.
    Deine Datatable bindet Du an die Combobox.
    Mit einem DataSet klappt es so jedenfalls, ob es mit Deiner DataTable direkt geht weiß ich nicht.
    Davor sagst Du der Combobox noch, welches Feld angezeigt werden soll und welches die Daten enthält.

    So in etwa (ungetestet und frei aus dem Geist geschrieben):

    VB.NET-Quellcode

    1. DeineComboBox.DisplayMember = "Name"
    2. DeineComboBox.ValueMember = "ID"
    3. DeineComboBox.DataSource = DeinDataSet.Tables("tabellenname")

    Moin Moin Zusammen,

    nach etwas aussetzen bin ich wieder da :)

    Anbei mal mein Code, wie es bisher aussieht.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports MySql.Data.MySqlClient
    3. Imports System.Net.Mail
    4. Public Class Form1
    5. Public Shared myConnectionString As String = "server=192.168.137.32;uid=user;pwd=passwort;database=db;port=3306;"
    6. Public Shared conn As New MySql.Data.MySqlClient.MySqlConnection
    7. Public Shared da As Common.DbDataAdapter
    8. Dim sql As String
    9. Public filename As String = Nothing
    10. Public filetarget As String = Nothing
    11. Public Function scanImage() As String
    12. 'Pfad zur Temp Datei des erfassten Bildes
    13. Dim strTempImagePath As String = String.Empty
    14. 'Windows GUI zur Interaktion mit dem Gerät
    15. Dim wiaDialog As New WIA.CommonDialog
    16. 'Variable für das erfasste Bild
    17. Dim wiaImage As WIA.ImageFile = Nothing
    18. Try
    19. 'Aufruf der Windows GUI zur Interaktion mit dem Gerät,
    20. 'rückgabe ist das erfasste Bild
    21. wiaImage = wiaDialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType, , , , False, )
    22. Catch ex As Exception
    23. MsgBox("Ein Fehler ist aufgetreten! Überprüfen Sie ob das Gerät Eingeschaltet und angeschlossen ist." & Environment.NewLine & Environment.NewLine & ex.Message)
    24. End Try
    25. If Not wiaImage Is Nothing Then
    26. 'Bild temporär Speichern
    27. Dim rnd As New Random
    28. Dim ZufallsZahl As Integer = rnd.Next(12, 600000000)
    29. filename = "tempfile_" & ZufallsZahl & ".jpg"
    30. filetarget = "C:\Temp\tempfile_" & ZufallsZahl & ".jpg"
    31. wiaImage.SaveFile(filetarget)
    32. PictureBox1.Visible = True
    33. PictureBox1.Image = New Bitmap(filetarget)
    34. Button2.Enabled = True
    35. Else
    36. MsgBox("Es wurde kein Bild erfasst!", MsgBoxStyle.Exclamation, "Information")
    37. End If
    38. Return strTempImagePath
    39. End Function
    40. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    41. Button2.Enabled = False
    42. End Sub
    43. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    44. scanImage()
    45. End Sub
    46. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    47. My.Computer.Network.UploadFile(filetarget, "ftp://ftp.cc/private/" & filename, "user", "passwort")
    48. MsgBox("Datei an KMS übergeben", MsgBoxStyle.Exclamation, "Information")
    49. PictureBox1.Visible = False
    50. Button2.Enabled = False
    51. End Sub
    52. End Class


    An und für sich, funktioniert die Verbindung zur Datenbank, jedoch habe ich nach zich Stunden keinen Lösungsansatz gefunden wie man das DropDown mit den SQL Daten füttert.
    Eure Hilfestellung in allen Ehren, jedoch steh ich nach weiteren Stunden googlen wieder an der Wand. :(
    Hat vielleicht jemand ein Snippet was er mir zur Verfügung stellen kann? Muss nicht mal vollständig sein, will es dann versuchen, selbst anzupassen und zu erweitern.

    Danke erstmal,

    Grüße Stefan
    Nein! Doch! OHH!

    samson schrieb:

    jedoch habe ich nach zich Stunden keinen Lösungsansatz gefunden wie man das DropDown mit den SQL Daten füttert


    Stefan - vielleicht suchst Du ja falsch?
    Hier ein Ansatz, der alles bringt, was zu diesem Thema zu sagen ist: LINK
    Und hier ein sehr einfaches Beispiel, so wie ich das meinte: LINK
    Die BindigSource Variante findest Du natürlich auch in den Treffern.

    Beste Erfolge und ein schönes Wochenende!
    Der DB-Zugriff in post#1 ist ein Holzweg, weil ohne typisiertes Dataset, zB jedesmal werden neue DataTables erstellt - aber mit ständig wechselnden DataTables kann man natürlich kein Bindungs-System konstruieren (doch, geht auch, aber irrwitzig aufwändig).
    Und in Post#6 nun kommt der DB-Zugriff gar nicht mehr vor - (das vereinfacht einiges ;) )

    Also wie man ein Datenmodell richtig konzipiert, und auf vielfältige Weise an eine Oberfläche bindet, wird in vier Views-Videos gezeigt - ich glaub im Film "DetailView" werden auch Comboboxen behandelt.
    Aber da dir das Gesamtkonzept fremd scheint, empfehle ich dir alle Vids von Anfang an zu gugge - es ist mit Sicherheit in jedem einzelnen ein Stück Neuland für dich dabei. Und insbesondere in "Bindings selbst setzen" werden Combos auch nochmal aufgegriffen.
    Moin Moin @simpleSoft
    Danke für die Gedankenanstöße,
    bin nun soweit:

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class Form1
    3. Sub read_drop()
    4. Dim DBconnectionstring As String = (("server=localhost;uid=user;password=passwort;database=test").ToString)
    5. 'MessageBox.Show(DBconnectionstring)
    6. Dim conn As New MySqlConnection
    7. Dim myCommand As New MySqlCommand
    8. Dim myAdapter As New MySqlDataAdapter
    9. Dim myData As New DataTable
    10. Dim SQL As String = "SELECT * FROM ms_kunden"
    11. conn.ConnectionString = DBconnectionstring
    12. Try
    13. conn.Open()
    14. Try
    15. myCommand.Connection = conn
    16. myCommand.CommandText = SQL
    17. myAdapter.SelectCommand = myCommand
    18. myAdapter.Fill(myData)
    19. ComboBox1.DataSource = myData
    20. ComboBox1.DisplayMember = "matchcode"
    21. ComboBox1.ValueMember = "id"
    22. Catch dbreaderror As MySqlException
    23. MessageBox.Show("Fehler beim Lesen aus der Datenbank: " & dbreaderror.Message)
    24. End Try
    25. Catch dbconnerror As MySqlException
    26. MessageBox.Show("Fehler beim Verbinden mit der Datenbank: " & dbconnerror.Message)
    27. Finally
    28. If conn.State <> ConnectionState.Closed Then conn.Close()
    29. End Try
    30. End Sub
    31. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    32. read_drop()
    33. End Sub
    34. Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    35. Label1.Text = ComboBox1.DisplayMember
    36. End Sub
    37. End Class


    Das auslesen in die DropDown-Box geht, jedoch komm ich nicht an die ID, wenn ich die Auswähl.
    Ich hab bspw 10 Dinge die in der Box ankommen, wenn ich das 3. Auswähl komm ich nicht an die ID die hinten dran liegt... Eventuell nenn Tipp für mich wo ich weiter suchen kann?

    Danke schon mal im Voraus.
    Nein! Doch! OHH!
    Hallo.

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class Form_GUI
    3. Private uConnection As MySqlConnection
    4. Private uAdapter As MySqlDataAdapter
    5. Private uTable As DataTable
    6. Private cmdObj As MySqlCommand
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Call loadConnection()
    9. End Sub
    10. Private Function loadConnection() As Boolean
    11. Dim strConnStr As String
    12. Dim strSQL As String
    13. uConnection = New MySqlConnection
    14. strConnStr = "Server=localhost;Database=test;UserID=theuer;Password=havok4"
    15. uConnection.ConnectionString = strConnStr
    16. Try
    17. uConnection.Open()
    18. Catch ex As Exception
    19. MsgBox("Fehler beim Verbindungsaufbau !" & vbCrLf & _
    20. "Fehler: " & ex.Message, MsgBoxStyle.Exclamation, "Test")
    21. Return False
    22. End Try
    23. strSQL = "SELECT * FROM de_test"
    24. cmdObj = New MySqlCommand
    25. With cmdObj
    26. .Connection = uConnection
    27. .CommandText = strSQL
    28. End With
    29. uAdapter = New MySqlDataAdapter(strSQL, uConnection)
    30. uTable = New DataTable("Data")
    31. uAdapter.Fill(uTable)
    32. For Each uRow In uTable.Rows
    33. Me.ComboBox_Items.Items.Add(uRow.ItemArray(1).ToString)
    34. Next
    35. Return True
    36. End Function
    37. End Class


    ItemArray(0) sind die ID's.

    MFG
    Purplehaze
    @haVok4.Purplehaze
    Das macht nun gar keinen Sinn. Samson war jetzt schon so weit, vernünftige Datenbindung zu benutzen und du willst ihn jetzt wieder zu den Items

    @samson
    Sieh dir wirklich mal die Videos bzw. Tutorials für die VierViews vom ErfinderDesRades an. Damit kannst du deine Probleme ohne großen Aufwand lösen.
    Du hast dann ein Typisiertes Dataset, in das du deine Daten einliest. Diese kannst du dann mit der BindingSource abrufen und damit auch auf die verschieden Spalten zugreifen.
    Und das alles aus dem Designer.
    Moin Moin @HamburgerJungeJr Danke für den Tipp... habs auch gefühlte 30 mal angeschaut jedoch bekomm ich es nicht gebacken, hab den Code wieder zurückgesetzt auf das was oben steht.
    Ich komm auf biegen und brechen nicht an die ID Nummer vom Eintrag. Kann mir vielleicht noch jemand helfen?
    Komm ich überhaupt an die ID mit dem Select wie ichs hab?
    Danke Stefan
    Nein! Doch! OHH!
    Du fügst deinem Projekt ein Dataset hinzu (Projekt->Neues Element Hinzufügen->Dataset).
    Diese öffnest du und fügst eine DataTable hinzu. (rechts Maustaste). Am besten benennst du diese, wie die SQL-Tabelle. (Machts später einfacher). Dieser Tabelle fügst du die Spalten hinzu, die deine Abfrage zurückgibt. (genauer Name) und stellst die Datentypen entsprechend deiner Datenbank ein.
    Nun fügst du im Designer ein Dataset ein. (aus der Toolbox)
    Dann gehst du in deinen Code und lädst die Daten in die Tabelle, die du eben erstellt hast.(Gleiche Methode wie oben, nur statt ds.fill(dt) nimmst du <DatasetInstanz>.fill(<DataTableName>)).
    Im Form-Designer fügst du eine Bindingsource hinzu (Toolbox), als DataSource nimmst du dein DataSet, und als Datamember deine Tabelle.
    Dann fügst du deine Combobox ein und nimmst dort als DataSource die BindingSource. DispalyMember und ValueMember setzt du entsprechen deiner Spalten. Mit DataBindings->SelectedItem, kannst du einstellen, in welche Spalte der ausgewählte Wert geschrieben bzw.abgerufen werden soll.

    Genauso gehst du mit allen anderen Steuerlementen vor und setzt die Binding-Property entsprechend deine Wünschen.
    Der große Vorteil ist nun, dass alle Control, die auf die gleiche BindingSource zugreifen, den gleichen Datensatz als Grundlage haben.
    @HamburgerJungeJr Die Datenbankanbindung hatte er auch bereits, wollte nur den ganzen Codeausschnitt posten, um Missverständnisse zu vermeiden. :P Und mit der DataTable durchlaufen und Items der ComboBox hinzuzufügen ist eine simple Methode.

    @samson Willst du die ID aus der ComboBox auslesen (diese beginnt ab 0): Label1.Text = Me.ComboBox_Items.SelectedIndex .. Oder hast du eine ID aus deiner Datenbank, die du auslesen willst? Wäre dann mit beispielsweise dem hier zu lösen:

    VB.NET-Quellcode

    1. Private Sub ComboBox_Items_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox_Items.SelectedIndexChanged
    2. Call getID()
    3. End Sub
    4. Private Function getID() As Boolean
    5. Dim strSQL As String
    6. strSQL = "SELECT User_ID FROM de_test WHERE Username='" & Me.ComboBox_Items.SelectedItem & "'"
    7. cmdObj = New MySqlCommand
    8. With cmdObj
    9. .Connection = uConnection
    10. .CommandText = strSQL
    11. End With
    12. uAdapter = New MySqlDataAdapter(strSQL, uConnection)
    13. uTable = New DataTable("blabla")
    14. uAdapter.Fill(uTable)
    15. Me.Label1.Text = uTable.Rows(0).Item(0).ToString
    16. Return True
    17. End Function
    @HamburgerJungeJr: Hat glaub kein Zweck. Was du dem TE beschreibst, hat er doch gefühlte 30 Mal selbst mit angesehen - wenn er das nicht nachbauen kann, noch mehr Worte helfen da glaub kaum.
    Auch haben wir hier das Anfänger-Verhalten, der falsch angefangen hat, nämlich mit einer DB, und nun die ganze Zeit ununterbrochen auf seine DB stiert, und den Kopf nicht freibekommt für die ungeheuerlichsten Tatsachen, etwa dass man - richtig angefangen - überhaupt niemals eine ID benötigt im selbstgeschriebenen Code.
    Und @haVok4.Purplehaze unterfüttert das, indem er wortreichen Code anbietet, der halt die ID auspuhlt ausse DB. Damit kann man zwar nix anfangen, das ist offen für Sql-Injection-Angriffe, und gelegentlich werden auch mehrere IDs geliefert, von denen aber nur eine benutzt wird - also in dem Proggi werden manche User evtl. einfach verschwinden, aber Hauptsache, die ID ist abgerufen :thumbdown:

    Und das wird nun 10000 Zeilen lang so weiter gehen - das hier ist ja nur eine Spalte, nur einer Tabelle, und nur ein Abruf. Fehlen ja noch Löschabfragen, EinfügeAbfragen, ÄnderungsAbfragen, und das bei mw 5 Tabellen a 5 Spalten, also so ungefähr 5 * 5 * 4 mal wird er solch Zeug zu schreiben haben - ups - da simmer ja schon bei knapp 2000 Zeilen.
    Ja, und wie gesagt: Wenn dann die User verschwinden, aufgrund des o.g. logischen Fehlers - kannste absolut vergessen, dass der Bug je gefixt wird.
    @ErfinderDesRades Danke für die Gemeinheiten mich für Dumm zu verkaufen.
    Ich benötige wenn dann NUR den INSERT für MySQL und diesen habe ich bereits erfolgreich implementiert!

    Um kurz zu erklären was das Programm machen soll:
    - ComboBox mit "Matchcodes" füllen aus der DB, was ja auch geht, danke an der Stelle an das Board.
    - Wenn der Matchcode ausgewählt wird, soll nach dem Scannen eines Bildes (was auch schon geht) dieses
    - per FTP an einen im Lokalen Netzwerk verfügbaren FTP übergeben werden (was auch schon geht)
    -
    Ich benötige jedoch für den Datenbank Insert die ID Nummer des
    Matchcodes was ich aus der SQL Tabelle auslese. dies ist nicht die ID
    Nummer des Datensatzes sondern die Kundennummer...
    Wie man hier erkennt, lese ich beides aus...

    VB.NET-Quellcode

    1. ComboBox1.DisplayMember = "matchcode"
    2. ComboBox1.ValueMember = "id"


    Es wird doch nicht so schwer sein, an den einen ID-Typ zu kommen, wenn der doch schon mit aus der SQL übergeben wird?!
    Ich verstehe es daher einfach noch nicht, da es meine Anfänge in VB sind,...
    Daher
    versuche ich es mit allem, was ich bekomme... und was die Injektionen
    angeht, die können nicht stattfinden da es NUR LOKAL verwendet werden
    kann.

    Daher bitte ich einfach um etwas Verständnis und mithilfe.
    werde es gleich noch mit den Tipps von Datagrid versuchen... Mal sehen ob mir das weiterhilft.

    Danke und Grüße Stefan
    Nein! Doch! OHH!
    Du sagst doch schon das deine ID = deine Kundennummer ist.

    Jetzt musst du doch nur noch Abfragen welche Informationen du benötigst.

    Eine weitere SQL Abfrage mit Where ID = Kundennummer und deinen benötigten Infos.

    Du kannst doch nicht aus der ComboBox noch den Kundennamen und die Bestellungen mit rausziehen, du hast die ID und damit musst du den Rest der Daten aus der DB holen.
    @shaebich mit
    ComboBox1.DisplayMember = "matchcode"
    ComboBox1.ValueMember = "id"
    hab ich doch beide Informationen bereits oder nicht?
    unter DisplayMember bekomm ich die Matchcodes ausgegeben (array in Combobox)
    und die ValueMember beinhaltet doch die 5 Stellige Kundennummer. Warum dann noch eine Abfrage?
    Nein! Doch! OHH!

    samson schrieb:

    @shaebich mit
    ComboBox1.DisplayMember = "matchcode"
    ComboBox1.ValueMember = "id"
    hab ich doch beide Informationen bereits oder nicht?
    unter DisplayMember bekomm ich die Matchcodes ausgegeben (array in Combobox)
    und die ValueMember beinhaltet doch die 5 Stellige Kundennummer. Warum dann noch eine Abfrage?


    Was ist dann dein Problem? :D