der henry: C#, mysql open datareader

Beitrag lesen

Hallo Rolf, hallo Leute,

Fehler gefunden .. die Intervalzeit zum Aufruf der Funktion war zu kurz d.h. Es wurde vor dem beenden der Funktion, die Funktion erneut aufgerufen usw.

Jetzt habe ich ein anderes Problem, das zwar einmal und nach Stunden kommt, aber um so kritischer ist.

Hier meine Funktion, ich "öffnen" und "schließe" jetzt die Datenbank vor jedem Zugriff.

 public static bool read_writedatapoints(string plcname)
	    {
			bool iffound = false;
			
			MySqlConnection connection = opensql();
			
		    using (MySqlTransaction transaction = connection.BeginTransaction())
		    {
			    try
			    {
				    using (MySqlCommand cmd = connection.CreateCommand())
				    {
					    cmd.Transaction = transaction;
					    cmd.CommandText =
						    $@"SELECT plcvarname, setpoint FROM writeplc WHERE plcvarname LIKE '{MySqlHelper.EscapeString(plcname)}%'";

					    using (MySqlDataReader rdr = cmd.ExecuteReader())
					    {
						    // prüfe ob Daten für die SPS vorhanden sind
						    if (rdr.HasRows)
						    {
							    iffound = 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 wurde ein Schreibefehl für die gewählte SPS gefunden: {item.Plcvarname}, Wert: {item.Setpoint}");
								    }
							    }
						    }
					    }

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

						    transaction.Commit();

						    if (Program.debuglevel == 1)
						    { Console.WriteLine("Schreibdaten gelesen und zugleich gelöscht."); }
					    }
					    else
					    {
						    if (Program.debuglevel == 2)
						    { Console.WriteLine("Es wurde keine Schreibbefehle für die gewählte SPS gefunden"); }
					    }
				    }
			    }
			    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());
				    Environment.Exit(1);
			    }
		    } 
		    closesql(connection);
		    return true;
	    }
	 

Es kam catch (Exception e) mit Meldung

Message: Record has changed since last read to table 'writeplc'

Aber dafür habe ich doch transaction ... bin hier falsch ????

Ich kann mir überhaupt nicht vorstellen, warum dies passieren kann ... selbstverständlich erst nach ca. 20 Std. Ich mache aktuell einen Test => worstcase mit Dauerbefeuerung der Datenbank.

Bin für jeden Tipp dankbar !!