Frage zu MySqlDataReader



  • Hallo,

    ich habe ein Problem mit dem Reader!
    und zwar Lese ich in einer schleife aus einer Tabelle Daten aus und übergebe die an einer Klasse!
    Jetzt habe ich das Problem das ich eine Funktion in der schleife aufrufe, die wiederum auch ein Reader nutzt (Soweit so gut)!
    Ich übergebe den Reader und schließe den, bloß wenn ich wieder zurück in die schleife komme fängt der erste Reader wieder von vorne an!
    Kann ich das umgehen das er weiter macht wo er aufgehört hat?

    Der Code sieht so aus!

    public void Start_Bestellung_Kurse(int u_ID, ref bestellung_shop_kurse list, error f)
            {
                MySqlCommand cmd = null;
                MySqlDataReader oReader = null;
                stringClass sClass = new stringClass();
    
                int Count = 0;
    
                string Temp01 = "";
                int DatumNow, Tag, Monat, Jahr = 0;
    
                Tag = DateTime.Now.Day;
                Monat = DateTime.Now.Month;
                Jahr = DateTime.Now.Year;
    
                if (Monat < 10)
                    Temp01 = Convert.ToString(Tag) + "0" + Convert.ToString(Monat) + Convert.ToString(Jahr);
                else
                    Temp01 = Convert.ToString(Tag) + Convert.ToString(Monat) + Convert.ToString(Jahr);
    
                DatumNow = Convert.ToInt32(Temp01);
    
                try
                {
                    if (!mysql_check_connect3(f))
                        EVENT_mysql_connect(f);
    
                    cmd = new MySqlCommand("SELECT * FROM reservation WHERE customer_id='" + u_ID + "'", mConn3);
    
                    oReader = cmd.ExecuteReader();
    
                    while (oReader.Read())
                    {
                        Datum_Event_Auslesen(Convert.ToInt32(oReader["event_id"]), f, oReader);
    
                        if (oReader.IsClosed)
                        {
                            oReader = cmd.ExecuteReader();
                            oReader.Read();
                        }
    
                        if (Count == 0)
                            Count++;
    
                        // Kurse Erstellen
                        if (Count == 1)
                        {
                            list.Create_Kurs_Id_1(Convert.ToInt32(oReader["event_id"]));
                            list.Create_Kurse_Art_1(oReader["appointment"].ToString());
                            list.Create_Kurse_Count_1(Convert.ToInt32(oReader["count"]));
                            list.Create_Kurse_Cash_1(Convert.ToInt32(oReader["cash"]));
                            Count++;
                        }
                        else if (Count == 2)
                        {
                            list.Create_Kurs_Id_2(Convert.ToInt32(oReader["event_id"]));
                            list.Create_Kurse_Art_2(oReader["appointment"].ToString());
                            list.Create_Kurse_Count_2(Convert.ToInt32(oReader["count"]));
                            list.Create_Kurse_Cash_2(Convert.ToInt32(oReader["cash"]));
                            Count++;
                        }
                        else if (Count == 3)
                        {
                            list.Create_Kurs_Id_3(Convert.ToInt32(oReader["event_id"]));
                            list.Create_Kurse_Art_3(oReader["appointment"].ToString());
                            list.Create_Kurse_Count_3(Convert.ToInt32(oReader["count"]));
                            list.Create_Kurse_Cash_3(Convert.ToInt32(oReader["cash"]));
                            Count++;
                        }
                        else if (Count == 4)
                        {
                            list.Create_Kurs_Id_4(Convert.ToInt32(oReader["event_id"]));
                            list.Create_Kurse_Art_4(oReader["appointment"].ToString());
                            list.Create_Kurse_Count_4(Convert.ToInt32(oReader["count"]));
                            list.Create_Kurse_Cash_4(Convert.ToInt32(oReader["cash"]));
                            Count++;
                        }
                        else if (Count == 5)
                        {
                            list.Create_Kurs_Id_5(Convert.ToInt32(oReader["event_id"]));
                            list.Create_Kurse_Art_5(oReader["appointment"].ToString());
                            list.Create_Kurse_Count_5(Convert.ToInt32(oReader["count"]));
                            list.Create_Kurse_Cash_5(Convert.ToInt32(oReader["cash"]));
                            Count++;
                        }
                    }
                }
                catch (Exception ex)
                {
                    string errorTXT = ex.Message + " (Start_Bestellung_Kurse)";
    
                    SendError(errorTXT, f);
                    errorTXT = "";
                }
                finally
                {
                    if (oReader != null)
                    {
                        oReader.Close();
                        oReader = null;
                    }
    
                    if (cmd != null)
                    {
                        cmd.Dispose();
                        cmd = null;
                    }
                }
    
                if (Count > 1)
                    Count--;
    
                list.Create_Kurse_Count(Count);
    
                if (Count != 0 && Count == 1)
                {
                    // Datum
                    list.Create_Kurse_Datum_1(Datum_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    // Zeit
                    list.Create_Kurse_Time_1(Time_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    // Ort
                    list.Create_Kurse_Ort_1(Ort_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                }
                else if (Count != 0 && Count == 2)
                {
                    // Datum
                    list.Create_Kurse_Datum_1(Datum_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Datum_2(Datum_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    // Zeit
                    list.Create_Kurse_Time_1(Time_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Time_2(Time_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    // Ort
                    list.Create_Kurse_Ort_1(Ort_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Ort_2(Ort_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                }
                else if (Count != 0 && Count == 3)
                {
                    // Datum
                    list.Create_Kurse_Datum_1(Datum_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Datum_2(Datum_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Datum_3(Datum_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    // Zeit
                    list.Create_Kurse_Time_1(Time_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Time_2(Time_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Time_3(Time_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    // Ort
                    list.Create_Kurse_Ort_1(Ort_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Ort_2(Ort_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Ort_3(Ort_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                }
                else if (Count != 0 && Count == 4)
                {
                    // Datum
                    list.Create_Kurse_Datum_1(Datum_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Datum_2(Datum_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Datum_3(Datum_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    list.Create_Kurse_Datum_4(Datum_Event_Auslesen(list.Show_Kurse_ID_4(), f));
                    // Zeit
                    list.Create_Kurse_Time_1(Time_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Time_2(Time_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Time_3(Time_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    list.Create_Kurse_Time_4(Time_Event_Auslesen(list.Show_Kurse_ID_4(), f));
                    // Ort
                    list.Create_Kurse_Ort_1(Ort_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Ort_2(Ort_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Ort_3(Ort_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    list.Create_Kurse_Ort_4(Ort_Event_Auslesen(list.Show_Kurse_ID_4(), f));
                }
                else if (Count != 0 && Count == 5)
                {
                    // Datum
                    list.Create_Kurse_Datum_1(Datum_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Datum_2(Datum_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Datum_3(Datum_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    list.Create_Kurse_Datum_4(Datum_Event_Auslesen(list.Show_Kurse_ID_4(), f));
                    list.Create_Kurse_Datum_5(Datum_Event_Auslesen(list.Show_Kurse_ID_5(), f));
                    // Zeit
                    list.Create_Kurse_Time_1(Time_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Time_2(Time_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Time_3(Time_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    list.Create_Kurse_Time_4(Time_Event_Auslesen(list.Show_Kurse_ID_4(), f));
                    list.Create_Kurse_Time_5(Time_Event_Auslesen(list.Show_Kurse_ID_5(), f));
                    // Ort
                    list.Create_Kurse_Ort_1(Ort_Event_Auslesen(list.Show_Kurse_ID_1(), f));
                    list.Create_Kurse_Ort_2(Ort_Event_Auslesen(list.Show_Kurse_ID_2(), f));
                    list.Create_Kurse_Ort_3(Ort_Event_Auslesen(list.Show_Kurse_ID_3(), f));
                    list.Create_Kurse_Ort_4(Ort_Event_Auslesen(list.Show_Kurse_ID_4(), f));
                    list.Create_Kurse_Ort_5(Ort_Event_Auslesen(list.Show_Kurse_ID_5(), f));
                }
    
                if (Count != 0)
                    Count = 0;
            }
    

    Und hier die andere Funktion!

    public string Datum_Event_Auslesen(int id, error f, MySqlDataReader oR = null)
            {
                if (oR != null)
                    oR.Close();
    
                MySqlCommand cmd = null;
                MySqlDataReader oReader = null;
    
                string Datum = "";
    
                try
                {
                    if (!mysql_check_connect3(f))
                        EVENT_mysql_connect(f);
    
                    cmd = new MySqlCommand("SELECT * FROM events WHERE id='" + id + "'", mConn3);
    
                    oReader = cmd.ExecuteReader();
    
                    while (oReader.Read())
                    {
                        if (oReader["dateFrom"].ToString() == oReader["dateTo"].ToString())
                            Datum = oReader["dateFrom"].ToString();
                        else
                            Datum = oReader["dateFrom"].ToString() + " - " + oReader["dateTo"].ToString();
                    }
                }
                catch (Exception ex)
                {
                    string errorTXT = ex.Message + " (Datum_Bestellung_Kurse)";
    
                    SendError(errorTXT, f);
                    errorTXT = "";
                }
                finally
                {
                    if (oReader != null)
                    {
                        oReader.Close();
                        oReader = null;
                    }
    
                    if (cmd != null)
                    {
                        cmd.Dispose();
                        cmd = null;
                    }
                }
    
                return Datum;
            }
    

    Ich hoffe ihr könnt mir da Helfen 🙂
    Ansonsten noch ein schönen Abend 😉

    Gruß



  • Klar kannst du das umgehen. Beende einfach die Schleife durch ein Break nach Aufruf der untergeordneten Methode.



  • Hallo,

    ich möchte aber das er in der schleife weiter macht und nicht von vorne beginnt!
    Weil so kommt er nie raus, aber ich möchte das er bei jedem durchlauf die Funktion aufrufen die auch oReader benutzt, aber er soll dann da weiter machen und nicht den Rest überspringen!



  • Ach, aufgrund des grausigen Codes hatte ich wohl 'nen Knoten in den Gedanken. Sorry.

    Der Reader beginnt von vorn, da du ihn schließt und anschließend wieder öffnest. - Damit startet er am Anfang. - Warum genau schließt du den Reader überhaupt in der untergeordneten Methode? Wozu brauch diese den Reader, wenn sie ihn sowieso nur schließt?



  • weil ich beim auslesen des Datum denn auch brauch!

    Ich habe nicht so die MySQL Erfahrung, da frage ich auch hier mal 🙂
    Was für eine Möglichkeit habe ich denn wenn ich woanders denn brauche, aber auch in der schleife wo er auch weiter machen soll?
    2 kann ich ja nicht offen haben!
    Es muss ja dafür eine Lösung geben, das man die schleife weiter nutzen kann, und nebenbei den anderen Reader nutzen kann oder?



  • Die stelle ist gemeint!

    while (oReader.Read()) 
                     { 
                         Datum_Event_Auslesen(Convert.ToInt32(oReader["event_id"]), f, oReader);
    


  • Wenn du mehrere DataReader (bzw. Commands) gleichzeitig durchlaufen willst, dann benötigst du auch mehrere Connections, s. z.B. Executing Multiple Commands on a single connection

    Deinen Code solltest du aber noch optimieren, denn bisher ist der grausig!
    Alleine die ganzen "list.Create_Kurse_..._X"-Aufrufe könntest du durch ein (internes) Array (bzw. eine List<>) ersetzen.
    Und anstatt der finally-Blöcke solltest du besser die using-Anweisung verwenden:

    using (var cmd = new MySqlCommand("..."))
    {
      // ...
    }
    


  • Ja danke für den link!
    Genau das brauche ich 😉
    Ja, also das mit der Klasse ist ein wenig anders, und das mit Array und list <> benutze ich auch im Projekt bereits ganz oft, bloß scheint mir für diese Aktion es so besser (Es sieht nicht schön aus, das stimmt schon), aber es funktioniert so wie ich es will, und kann damit ganz leicht wunderbar arbeiten 🙂

    (Die Hauptsache ist das es Fehlerfrei funktioniert!

    Gruß


Anmelden zum Antworten