Antwort an „der henry“ verfassen

Halllo,

ich habe eine Fehlermeldung/Absturz den ich nicht beseitigen bzw. finden kann

Fehlermeldung: **There is already an open DataReader associated with this Connection which must be closed first. **

Funktion

  • "connection" ist die geöffnete Datenbank. Die Datenbank muss nicht geschlossen werden, die Datenbank wir im Intervall beschrieben.

  • starte eine mysql transaction

  • lese aus der datenbank nach bestimmten Kriterien

  • wird etwas gefunden -> datareader zum auslesen und Daten "intern" speichern -> gefundene Daten in der Datenbank löschen

  • transaction beenden.

Ich habe alles mit "using" try/catch geschrieben ... da am Ende von "using" der datareader automatisch geschlossen wird ... so dachte ich.

public static bool read_writedatapoints(string plcname)
        {
            bool varfind = false;

            using (MySqlTransaction transaction = connection.BeginTransaction())
            {
                try
                {
                    using MySqlCommand cmd = connection.CreateCommand();
                    {
                        try
                        {
                            cmd.Transaction = transaction;
                            cmd.CommandText =
                                $@"SELECT plcvarname, setpoint FROM writeplc WHERE plcvarname LIKE '{MySqlHelper.EscapeString(plcname)}%'";
                       
                            using MySqlDataReader rdr = cmd.ExecuteReader();
                            {
                                try
                                {
                                    // prüfe ob Daten für die SPS vorhanden sind
                                    if (rdr.HasRows)
                                    {   
                                        varfind = true;
                                        
                                        // gefundene Daten aus der SPS sichern
                                        while (rdr.Read())
                                        {
                                            WRITEPLCdatapoint item = new WRITEPLCdatapoint();
                                            item.Plcvarname = (string)rdr["plcvarname"];
                                            item.Setpoint = (string)rdr["setpoint"];
                                            writeplcdatapoints.Add(item);

                                            if (Program.debuglevel == 1)
                                            {
                                                Console.WriteLine($@"Es ein Schreibefehl für die gewählte SPS gefunden: 
												        			{item.Plcvarname}, 
														        	Wert: {item.Setpoint}");
                                            }
                                        }
                                    }
                                    else
                                    {
                                        varfind = false;
                                        if (Program.debuglevel == 2)
                                        {
                                            Console.WriteLine(
                                                "Es wurde keine Schreibbefehle für die gewählte SPS gefunden");
                                            return false;
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(
                                        "Fehler DataReader in Funktion: read_writedatapoints. Fehler {e}");
                                    return false;
                                }
                            }

                            if (varfind)
                            {
                                cmd.CommandText =
                                    $@"DELETE FROM writeplc WHERE plcvarname LIKE '{MySqlHelper.EscapeString(plcname)}%'";
                                cmd.ExecuteNonQuery();

                                if (Program.debuglevel == 1)
                                { Console.WriteLine("Schreibdaten gelesen und zugleich gelöscht."); }
                            }

							transaction.Commit();
                            return true;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("Fehler beim lesen der Schreibdaten für SPS {0}", e.GetType());
                            Console.WriteLine("Message: {0}", e.Message);
                            transaction.Rollback();
                            Console.WriteLine("Error Rollback Exception Type: {0}", e.GetType());
                        }
                    }
                }
                catch (Exception e)
                { Console.WriteLine("Fehler bei transaction in Funktion: read_writedatapoints. Fehler {e}"); }
            }
            return false;
        }

Der Fehler kommt nur, wenn er Daten in der Datenbank findet, also if (rdr.HasRows) TRUE

Ich sehe es nicht, vermutlich suche ich schon zu lange 😉

Vielen Dank !!

freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen