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