Noch ein Problem, diesmal der reader

Rene42

Erfahrenes Mitglied
Hi Leute,

ja ich weiß schon wieder ich. Nachdem ich zuletzt einige Fortschrite mit meinem Programm gemacht habe, bin ich nun wieder an einer STelle wo ich nicht genau weiß wie es weitergehen soll.

Code:
 Dim con As New MySql.Data.MySqlClient.MySqlConnection
        Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
        Dim reader As MySql.Data.MySqlClient.MySqlDataReader
        con.ConnectionString = "Data Source=localhost;" _
          & "Initial Catalog=Doppelkopf;UID=root;password=Re2209ne"
        cmd.Connection = con
        con.Open()
        'Alle Betroffenen CoBoS und Rabus auflisten auflisten
        Dim CoBo() As ComboBox = {Me.CoBo01, Me.CoBo02, Me.CoBo03, Me.CoBo04, Me.CoBo05}
        Dim RaBu() As RadioButton = {Me.RaBuRe01, Me.RabuRe02, Me.RaBuRe03, Me.RaBuRe04, Me.RaBuRe05}
        'Nun in einer Schleife jeden Spieler durchgehen
        Dim n As Integer = 0
        Do
            'Den Geber bei 5 Spielern überspringen
            If Me.TSMFivePlayer.Checked And n = Geber Then n = n + 1
            'Hat der Spieler gewonnen?
            Dim Win As Boolean = False
            If RaBu(n).Checked And Me.RaBuSiegRe.Checked Then Win = True
            If RaBu(n).Checked = False And Me.RaBuSiegContra.Checked Then Win = True
            'Die alten Daten in den Reader laden
            cmd.CommandText = "SELECT * FROM Spieler WHERE name='" & CoBo(n).SelectedItem & "'"
            reader = cmd.ExecuteReader()
            reader.Read()                       
            'Nun die Punkte festelgen +bei Sieg -bei Verlust
            Dim P As Integer
            If Win Then
                P = reader("Punkte") + Pkt
            Else
            ---->    P = reader("Punkte") - Pkt
            End If
            Dim Spiele As Integer = reader("Spiele") + 1
            Dim Siege As Integer = reader("Siege")
            'Siege erhöhen, falls Gewinn
            If Win Then Siege = Siege + 1
            'Reader vernichten
            reader.Close()
            'Nun die Punkte und Spiele updaten
            cmd.CommandText = "UPDATE Spieler SET Punkte='" & P & "', Spiele='" & Spiele & "', Siege='" & Siege & "'"
            cmd.ExecuteNonQuery()
            n = n + 1
        Loop Until n = CoBo.Length
        con.Close()

In der markierten Zeile meldet der Kompiler einen Fehler, nämlilch man könnte auf kein Feld des Reader zugreifen die Read Funktion des Reader aufgerufen wurde. Dies versteh ich nun nicht, da ich ja reader.Read() ausführe. Weiß jemand, was ich falsch mache?

Rene42
 
Zuletzt bearbeitet:
Hallo Rene,

mal abgesehen vom sehr schlecht lesbaren Code...
Schaue dir das mal on und schalte bei dir
Option Strict auf ON


' // Daten lesen
While reader.Read()

MsgBox (reader.Item("Punkte").ToString)

End While

reader.Close()

Gruß
Jens
 
Dank dir erstmal, dass wieder so schnell reagiert wurde.

Die schlechte Lesbarkeit des Codes ist mir auch schon aufgefallen, leider weiß ich nicht genau was dagegen zu tun ist, mir ist keine Methode bekannt VB Code hervorzuheben.

Ich habe mit deinem Tipp den Fehler nun eingegrenzt. Es läuft darauf hinaus, dass
der Ausdruck CoBo(n).SelectedItem in:
Code:
Dim CoBo() As ComboBox = {Me.CoBo01, Me.CoBo02, Me.CoBo03, Me.CoBo04, Me.CoBo05}
do
 CoBo(n).SelectedItem
 n=n+1
loop until n=CoBo.length
immer Nothing ist, obwohl in den zugehörigen ComboBoxen etwas ausgewählt ist.

Mach nun alles mit OPTION strict, hab die Convert Funktion gnadenlos eingesetzt. Aber geholfen hat es auch nicht so wirklich.

Rene
 
Zuletzt bearbeitet:
Hallo Rene,

also die schlechte Lesbarkeit kannst du verbessern in dem
du dir einen anderen Stil zulegt und den Code besser formatierst.

Und obwohl ich die Codezeilen von dir ganz anders schreiben würde
funktioniert das von dir gepostete bei mir.
Zumindest wenn ich vor CoBo(n).SelectedItem mal zum Test ein MsgBox
setze. Der Fehler muss woanders liegen.
Wie selektierst du denn die Comboboxen ? Also wie wählst du die
Einträge aus ? per Hand oder Programmcode ?
Falls 2. zutrifft dann hoffentlich nicht per Texteigenschaft, denn dann ist
SelectedItem wirklich Nothing.

So kann man das auch schreiben:

Code:
       Dim CoBo() As ComboBox = {Me.CoBo01, Me.CoBo02, Me.CoBo03, Me.CoBo04, Me.CoBo05}

        For i As Integer = 0 To CoBo.GetUpperBound(0)
            MsgBox(CoBo(i).SelectedItem)
        Next

Jens
 
Also der Witz, ist bei mir ja folgender, wenn ich eine Schleife programmiere, die mir immer den WErt der CoBoBox bei änderung ausgibt, bekomme ich auch immer etwas.

Porbier ich es aber an obigen Quellcode, gibt es eine Fehlermeldung, weil die Variabel die gleiche Cobo.SelectedItem gesetzt wird leer ist.

Hab das bereits mit Schritt für Schritt überprüft und schnall einfach nicht warum dort nichts ausgelesen wird, ist ziemlich frustrierend.

Zu deiner Frage, ich wähle den Eintrag per Hand aus, der lautet dann z.B. "Rene" vorher wurden die Eintragen per Code eingetragen.

Leider weiß ich noch immer nicht genau woran es lag, aber nun geht es, wenn ich die Texteigenschaft der ComboBox nehme...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück