C# Auslesen einer Tabelle in MYSQL

Hornisse

Ensign
Registriert
Juni 2006
Beiträge
194
Ich hab ein Problem das der erste Wert in einer Tabelle weg ist. (Bin kein Experte in C#)
Ich poste mal den Code dazu:
Code:
 private void SprungPunkteload() //Lade die Anzahl der Einträge
        {
           
            MySqlConnection con = new MySqlConnection(conn);
            MySqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "Select * from sc.sprungpunkte";
            MySqlDataReader Reader;
                con.Open();
                Reader = cmd.ExecuteReader();
                Reader.Read();
                anfang = (Reader.GetInt16("SPID"));
                while (Reader.Read())
                {
                    SPID = (Reader.GetInt16("SPID"));
                    
                }
                
                Reader.Close();
                con.Close();

                matrix();

                    
              


        }
        private void matrix() //Systeme auslesen mit deren Sprungpunkten
        { 
                    MySqlConnection con = new MySqlConnection(conn);
                    MySqlCommand cmd = con.CreateCommand();                 
                    MySqlDataReader Reader;
                    ZID = 0;
                    SID = 0;
                    

                    

          for (int pende = 1; pende < SPID; ++pende)

                {

                    cmd.CommandText = "Select * from sc.sprungpunkte where SID = " + pende;

                    con.Open();                  
                    Reader = cmd.ExecuteReader();
                    Reader.Read();
                    while (Reader.Read())
                    {                                              
                        ZID = (Reader.GetInt16("ZID"));
                        IEID = (Reader.GetInt16("EID"));                     
                        spp1 += ZID + "," + IEID + ",";
                     
                        
                    }

                    spp1 = spp1.Substring(0, spp1.Length - 1);
                    spp1 = spp1 + "\n";
                    sprung1.Add(spp1);                    
                    con.Close();
                   
                }
          foreach (string sz in sprung1)
          {
              richTextBox1.Text = sz; //Anzeigen in der Temp_Box ob so gewollt
          }
                        
          spp1 = "";
        }
List<string> sprung1 = new List<string>();

So sieht es aus, ist nur zum überprüfen in der Box um zu sehen ob die Zeilen passen.

1.png

Da wird mir immer der erste Eintrag in der Tabelle nicht angezeigt und das bei jeder SID.

die Tabelle sieht so aus:

auschnitt.png


Wie gesagt ich bin kein Experte und frag mich warum der erste Eintrag immer futsch ist,
obwohl die ID stimmt.
 
Zuletzt bearbeitet:
Das müsste an der for-schleife liegen, wenn ich mich nicht irre.

Code:
for (int pende = 1; pende < SPID; ++pende)
 
                {
                 ...
                }

Beim ersten Durchlauf ist pende = 1. Die SPID des ersten Eintrages ist aber ebenfalls 1. Daher ist die Bedingung für die for-schleife nicht erfüllt, weil 1 ist nicht kleiner als 1 ist. Beim zweiten Durchlauf passt es dann, weil pende = 1 kleiner als SPID = 2 ist. Du müsstest also entweder pende auf 0 anstatt auf 1 setzen, oder du benutzt den <= operator. :)

Code:
for (int pende = 0; pende < SPID; ++pende)
 
                {
                 ...
                }

oder

Code:
for (int pende = 1; pende <= SPID; ++pende)
 
                {
                 ...
                }
 
@Kyro0
Wie kommst Du darauf, dass die SPID sich während der Schleife ändern würde? Der Wert wird außerhalb gesetzt. Vermutlich soll er auf den größten vorhandenen Wert gesetzt werden (while-Schleife ab Codezeile 12). Ich gehe davon aus, dass es eine globale Variable ist.

Der Fehler ist imho ein anderer. Mit jedem Aufruf von "Reader.Read();" wird ein neuer Datensatz gelesen. Die while-Schleife bei Zeile 48 startet deshalb erst beim zweiten Datensatz. Also Zeile 47 entfernen und es sollte funktionieren.


Noch ein Hinweis zur Bestimmung der größten SPID: wenn man die Rückgabewerte eines Selects nicht sortiert, dann ist deren Reihenfolge unbestimmt. Der letzte Datensatz hat also nicht zwingend die größte SPID. Auch wäre es vermutlich sinnvoller, gleich mit dem SQL-Statement die größte SPID abzufragen - mittels MAX.
 
Zuletzt bearbeitet: (Typo)
Ich hab keinen blassen Schimmer warum das nun funktioniert, da muss ich muss wohl mal etwas tiefer reinlesen.

Zeile 47 entfernt bzw. aus kommentiert und der erste Eintrag eines Satzes ist nun da^^.

Danke dir Andreas
 
Hornisse schrieb:
Ich hab keinen blassen Schimmer warum das nun funktioniert, da muss ich muss wohl mal etwas tiefer reinlesen.

Zeile 47 entfernt bzw. aus kommentiert und der erste Eintrag eines Satzes ist nun da^^.

Danke dir Andreas

weil du 2 mal liest, bevor du irgendwas damit machst

Reader.Read(); ->> liest die erste Zeile
while (Reader.Read()) ->> liest die nächste Zeile ein, die erste wird einfach wieder verworfen.
 
Genau, das wars! Reader.Read(); gibt immer das Oberste Element von einem Stapel aus und "wirft es dann weg".
Deswegen kommt beim Reader.Read() in der while Schleife nur die 2. Zeile an.
 
Zurück
Oben