der henry: c# mysql Start Transaction

Beitrag lesen

Guten Morgen,

jetzt habe ich meinen Code angepasst und die Funktion hier komplett eingestellt.

  1. die connection habe ich kommentiert

  2. rdr = cmd.ExecuteReader(); nach dem select

  3. Ich nutze Raider und hier kommt im Debugger beim Aufruf cmd.ExecuteNonQuery();

Was auch immer an der Transaktion falsch ist, warum verschachtelt ???

  1. Einrückung, ich kopiere den Code einfach aus Raider heraus. In Raider ist alles OK / Normal

  2. siehe 2.

  3. Das mit dem Rollback habe ich nur kopiert ... so richtig verstehe ich das nicht. 😉 Den Rollback brauche ich eigentlich nur, wenn beim DELETE etwas fehl schlägt ... sonst nicht, oder ?

    Ich habe doch ein transaction.Commit() drin ... hier verstehe ich deine Aussage nicht ... oder das Konzept 😟

Die letzten Punkte sollten erledigt sein ... ich brauche das SELECT um erst Daten auszulesen, bevor diese sofort und in einem Zug gelöscht werden (Transaktion)

Ich haben jetzt den rdr.Read einfach mit dran gehängt ... kann man sicher schöner in eine Funktion auslagern und dann gleich in der Transaction (try) mit aufrufen oä.

public static bool read_writedatapoints(string plcname)
		{
			MySqlCommand cmd = connection.CreateCommand();
			
			// Start a local transaction.
			MySqlTransaction transaction = connection.BeginTransaction();

			// cmd.Connection = connection;
			cmd.Transaction = transaction;	
			
			MySqlDataReader rdr = null;
			
			try
			{
				cmd.CommandText = "SELECT * FROM writeplc WHERE LEFT(plcvarname," + plcname.Length + ") = " + "'" +
				                  plcname + "'";
				
				// gelesene Schreibwerte auswerten
				rdr = cmd.ExecuteReader();

				if (rdr.HasRows)
				{
					cmd.CommandText = "DELETE FROM writeplc WHERE LEFT(plcvarname," + plcname.Length + ") = " + "'" +
					                  plcname + "'";

					cmd.ExecuteNonQuery();
					if (Program.debuglevel == 2) { Console.WriteLine("WriteData read and deleted."); }
				}
				transaction.Commit();
			}
			catch (Exception ex)
			{
				Console.WriteLine("Fehler beim lesen der Schreibdaten für SPS {0}", ex.GetType());
				Console.WriteLine("Message: {0}", ex.Message);

				// Attempt to roll back the transaction.
				try { transaction.Rollback(); }

				catch (Exception ex2)
				{
					Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType()); 
					Console.WriteLine("  Message: {0}", ex2.Message);
				}
			}

		

			if (rdr.HasRows)
			{
				while (rdr.Read())
				{
					WRITEPLCdatapoint item  = new WRITEPLCdatapoint();
					item.Plcvarname      = (string)rdr["plcvarname"];
					item.Mpi             = (sbyte)rdr["mpi"];
					item.Setpoint        = (string)rdr["setpoint"];
					writeplcdatapoints.Add(item);

					if (Program.debuglevel == 2)
					{ Console.WriteLine("Write command were found for the selected PLC.: " + item.Plcvarname + " , MPI: " + item.Mpi + " , Setpont: " + item.Setpoint); }
				}
				rdr.Close();
				return true;
			}
			else
			{
				Console.WriteLine("No write command were found for the selected PLC.");
				rdr.Close();
				return false;
			}
		}