der henry: C#, mysql open datareader

Beitrag lesen

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 !!