MySQL-Datenbankabfragen in mehreren Tabs/ListViews

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von markoh2603.

    MySQL-Datenbankabfragen in mehreren Tabs/ListViews

    Hallo,

    ich bin gerade dabei ein Programm zu prgrammieren,welches in mehreren Tabs MySql-Datenbankabfragen durchführt, quasi in jedem Tab eine andere Datenbank. Die Daten werden in eine ListView ausgegeben. Die erste Abfrage im 1. Tab funktioniert auch, nur die Abfragen in den anderen Tabs nicht. Die 1. Abfrage habe ich allerdings auch in die Main-Sub reingeschrieben, dieweiteren dann in die Sub jedes Tabs.

    Hat jemand nen Tipp für mich wie ich wo die Abfragen plazieren muss, dass die im richtigen Tab in der richtigen ListView angezeigt werden?

    Danke

    MarkOH
    Wenn du deinen Code posten würdest den du zur zeit hast kann man dir besser helfen.

    Habe selbst ncoh einmal bissl rumprobiert, bekomme es aber leider nicht hin. Hier mal der Quellcode:

    Quellcode

    1. Public Class Main
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim conn As New MySqlConnection
    4. Dim myConnectionString As String
    5. Dim cmd As New MySqlCommand
    6. 'Aufbau der Datenbankverbindung
    7. 'server= Adresse des Datenbankservers
    8. 'uid= Benutzername des Datenbankusers
    9. 'pwd= Passwort des Datenbankusers
    10. 'database= zu benutzende Datenbank
    11. myConnectionString = _
    12. "server=localhost;" _
    13. & "uid=test;" _
    14. & "pwd=test;" _
    15. & "database=tfcv;"
    16. conn.ConnectionString = myConnectionString
    17. Try
    18. conn.Open()
    19. cmd.Connection = conn
    20. cmd.CommandText = "SELECT * FROM `tbl_playerdata` LIMIT 0 , 60" 'Auszuführender SQL-Befehl
    21. cmd.Prepare()
    22. Dim reader As MySqlDataReader
    23. reader = Nothing
    24. reader = cmd.ExecuteReader()
    25. 'ListView-Element füllen
    26. Dim SubItem As ListViewItem
    27. While (reader.Read())
    28. Dim id As String = reader.GetString(0) 'der Variable id dem 1. Abfrage-Wert zuordnen
    29. Dim clan As String = reader.GetString(1) 'der Variable clan dem 2. Abfrage-Wert zuordnen
    30. Dim soldier As String = reader.GetString(2) 'der Variable soldier dem 3. Abfrage-Wert zuordnen
    31. With ListViewVietnam.Items
    32. SubItem = .Add(id) 'id in ListView in 1 Spalte eintragen
    33. SubItem.SubItems.Add(clan) 'clan in ListView in 2 Spalte eintragen
    34. SubItem.SubItems.Add(soldier) 'soldier in ListView in 3 Spalte eintragen
    35. End With
    36. End While
    37. Catch ex As MySqlException
    38. MessageBox.Show("MySQL-Exception: " & ex.Message)
    39. Catch ex As Exception
    40. MessageBox.Show("Allgemeiner Fehler: " & ex.Message)
    41. End Try
    42. conn.Close()
    43. End Sub
    44. Private Sub ListViewServer2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListViewServer2.SelectedIndexChanged
    45. End Sub
    46. Private Sub TabPage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage2.Click
    47. Dim conn As New MySqlConnection
    48. Dim myConnectionString As String
    49. Dim cmd As New MySqlCommand
    50. 'Aufbau der Datenbankverbindung
    51. 'server= Adresse des Datenbankservers
    52. 'uid= Benutzername des Datenbankusers
    53. 'pwd= Passwort des Datenbankusers
    54. 'database= zu benutzende Datenbank
    55. myConnectionString = _
    56. "server=localhost;" _
    57. & "uid=test;" _
    58. & "pwd=test;" _
    59. & "database=tfcv;"
    60. conn.ConnectionString = myConnectionString
    61. Try
    62. conn.Open()
    63. cmd.Connection = conn
    64. cmd.CommandText = "SELECT * FROM `tbl_playerdata` LIMIT 0 , 60" 'Auszuführender SQL-Befehl
    65. cmd.Prepare()
    66. Dim reader As MySqlDataReader
    67. reader = Nothing
    68. reader = cmd.ExecuteReader()
    69. 'ListView-Element füllen
    70. Dim SubItem As ListViewItem
    71. While (reader.Read())
    72. Dim id As String = reader.GetString(0) 'der Variable id dem 1. Abfrage-Wert zuordnen
    73. Dim clan As String = reader.GetString(1) 'der Variable clan dem 2. Abfrage-Wert zuordnen
    74. Dim soldier As String = reader.GetString(2) 'der Variable soldier dem 3. Abfrage-Wert zuordnen
    75. With ListViewVietnam.Items
    76. SubItem = .Add(id) 'id in ListView in 1 Spalte eintragen
    77. SubItem.SubItems.Add(clan) 'clan in ListView in 2 Spalte eintragen
    78. SubItem.SubItems.Add(soldier) 'soldier in ListView in 3 Spalte eintragen
    79. End With
    80. End While
    81. Catch ex As MySqlException
    82. MessageBox.Show("MySQL-Exception: " & ex.Message)
    83. Catch ex As Exception
    84. MessageBox.Show("Allgemeiner Fehler: " & ex.Message)
    85. End Try
    86. conn.Close()
    87. End Sub
    88. Private Sub TabPage1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage1.Click
    89. End Sub
    90. Private Sub ListViewVietnam_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListViewVietnam.SelectedIndexChanged
    91. End Sub
    92. End Class


    Wie oben schon geschrieben, die Abfrage die in der Sub Main steht funktioniert und wird im 1. Tab in der 1. ListView angezeigt, die 2. Abfrage läuft aber nicht, muss ich diese Abfrage wo anders hinschreiben?

    Danke

    MarkOH
    Anmerkung am Rande:
    Wenn du schon (fast) identische Abfragen hast, solltest du sie in eine Funktion auslagern.

    die 2. Abfrage läuft aber nicht
    Heisst was?
    Sie wirft Fehler oder das TabPage2.Click-Event wird überhaupt nicht gefeuert?

    Hast du mal versucht einen Breakpoint zu setzen und Schritt für Schritt durchzugehen, was passsiert?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    markoh2603 schrieb:

    Über Funktion hatte ich schon nachgedacht, wird wohl auch noch kommen.


    Wird wohl auch noch kommen?

    Kleiner Tipp ... mach das bitte mal als aller Erstes. Vorallem auch für die Connection ein eigenes Connection-Object zu erstellen.

    Der Grund dafür ist einfach: Du kannst erstens genau sagen bei welchem Teil es hakt und zweitens ist Dein Code viel besser lesbar und auf Fehler zu überprüfen weil er dadurch wesentlich schlanker wird. Bei 10 Zeilen Code die man überprüfe findet man einfach einen Fehler eher als bei 100 Zeilen Code.

    Falls Du noch nicht genau weisst wie, guckst Du hier (dort geht es auch darum Code durch Aufteilung in Funktionen und Objecte besser lesbar/wartbar/änderbar zu machen): [VB 2010] MySQL Verbindung Fehler

    Gruß

    Rainer

    markoh2603 schrieb:

    Alles klar Rainer, dass schau ich mir da gleich mal an, kannst du mir aber auch schon helfen, warum die Abfrage nur im 1. Tab und nicht im 2. in die ListView geschrieben wird?


    Könnte ich, aber ich tue es nicht.

    Nein, das ist keine Bosheit, sondern schlicht es wird Dir direkt selber ins Auge springen wenn Du erstmal alles aufgeteilt hast wie oben gesagt.

    Dann passiert genau das was ich geschrieben habe: Der Code wird übersichtlicher da nur die relevanten Zeilen bestehen bleiben und Dir fällt es wie Schuppen von den Augen ... und denk daran wenn die Erkenntnis eintritt wieso nur das ListView im 1 Tab gefüllt wird, dann nicht zu hart den Kopf auf die Tischkante knallen ... der Tisch kann nix dafür. :D

    Und ich sage es Dir nicht damit Du jetzt diesen Lerneffekt durchmachst und danach NIE, NIE, NIE wieder in Deinem Leben auf die Idee kommst Code in der Art und Weise wie oben zu bauen ... und auch nie wieder Code mit C&P einfügst. ;)

    Gruß

    Rainer
    Ich kann mir zwar vorstellen was du gerade meinst mit C&P, aber wenn ich

    Quellcode

    1. With ListViewVietnam.Items

    durch

    Quellcode

    1. With ListViewServer2.Items


    ersetze, funktionierts genauso wenig.

    Aber nichts desto trotz werde ich mir deinen Rat zu Herzen nehmen und den Code besser aufbauen durch die Verwendung von Funktionen.

    markoh2603 schrieb:

    Ich kann mir zwar vorstellen was du gerade meinst mit C&P, aber wenn ich

    Quellcode

    1. With ListViewVietnam.Items

    durch

    Quellcode

    1. With ListViewServer2.Items


    ersetze, funktionierts genauso wenig.


    Richtig, genau darauf habe ich getippt weil das definitiv dazu führt das das zweite ListView nicht befüllt wird wenn die Funktion ausgeführt wird, sondern das erste ListView nur neu befüllt wird.

    Was passiert denn wenn Du im Form_Load-Event das zweite ListView angibst? Wird es dann befüllt?

    Bzw. hast Du schonmal überprüft ob der Code für die Befüllung des zweitens ListViews überhaupt angesprungen wird?

    Gruß

    Rainer
    Wenn ich ins Form-Load die ListViewServer2 angebe, wirds korrekt gemacht, mmh könnte ja nu einfach alles ins FormLoad machen. Ne Spaß beiseite.

    Aber scheinbar wird tatsächlich der Code für die Belüllung vom 2. ListView garnicht angesprungen. Warum, da muss ich allerdings passen, da ich wie du sicher schon bermerkt hast, gerade erst angefangen habe mit programmieren, fehlt mir da auch gerade die Idee.

    Übrigens nicht das du denkst, ich musste mir den Code vorhin nochmal durchschauen nach deinem C&P-Kommentar, das war schonmal richtig gemacht, da es aber auch nicht funktionierte hatte ich es wieder rückgängig gemacht, wußte also gleich worauf du hinaus wolltest und musste schon schmunzeln
    Okay. ;)

    Dann gucke mal ob Du ein Event findest das generell bei Clicken auf einen Register-Tab ausgeführt wird (also anstatt TabPage2_Click dann sowas wie Tab_Click oder so).

    Wenn ja, füge das mal ein und gucke ob das dann angesprungen wird wenn Du auf einen Register-Tab klickst. Wenn ja, kannst Du dann vermutlich dort die angeclickte Tab auslesen und danach die auszuführende Aktion auswählen.

    Wobei ... du könntest auch mal prüfen ob es mit TabPage1_Click anstatt TabPage2_Click funktioniert. Denn normalerweise ist die Aufzählung der Tabs des Registers zero-based wenn ich mich nicht täusche (also Tab 1 ist dann eigentlich Tab 0 und Tab 2 ist dann Tab 1).

    Muss jetzt auch ein wenig raten weil ich in .NET noch nie das Register-Control eingesetzt habe. ^^

    Gruß

    Rainer
    So ich habs mal fein gemacht und dazu mal den Namespace aus dem Beitrag den du mir empfohlen hast, genommen und entsprechend verändert, Abfrage funktioniert.

    Leider komme ich mit dem Tabcontrol immernoch nicht klar, habe paar Sachen probiert die mit logisch erschienen, aber das führte alles nicht zum Erfolg.
    Das die 1. Abfrage im FormLoad steht, gefällt mir ja auch nicht so richtig, sollte schon im Tab1 stehen und die 2. Abfrage im Tab2,halt wirklich dort wo es hingehört, sonst kann ich auch gleich alle Abfragen in die FormLoad machen.
    Okay, hab es jetzt mal nachgebaut. ^^

    Offensichtlich ist es ein Bug, da bei mir das TabPageX-Event auch nicht ausgelöst wird.

    Dafür funktioniert folgendes Event bei mir zuverlässig:

    VB.NET-Quellcode

    1. Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
    2. MsgBox("SelectedIndexChanged: " & Me.TabControl1.SelectedTab.Text)
    3. End Sub


    Mein Tab-Control heisst TabControl1, dass musst Du natürlich auf den Namen Deines Controls anpassen.

    Durch "Me.TabControl1.SelectedTab.Text" kommst Du an den Text des Tabs. Irgendwie habe ich keine Möglichkeit gefunden an den Tab-Index ran zu kommen (vllt auch nur nicht intensiv genug geguckt ... möglich ^^). Wenn die Beschriftung Deiner Tabs eindeutig ist, dann kannst Du ja darüber feststellen welches Tab gewählt wurde und dann die entsprechende Funktion aufrufen (und schon macht sich die Trennung in separate Funktionen los gelöst vom Event-Handling bezahlt *g*).

    EDIT:

    Verdammt ... so blind muss man erstmal sein. ^^

    Nimmst Du "Me.TabControl1.SelectedIndex" und Du bekommst den Tab-Index zurück, allerdings als zero-based. D.h. TabPage1 hat den Index 0 und TabPage2 hat den Index1.

    Gruß

    Rainer