Hallo Henry,
Du machst mich echt fertig.
Am 23.10. frug ich:
Ich nehme an, du verwendest das MySqlConnector Nuget-Paket? Oder verwendest Du MySql.Data?
Das hast Du nicht beantwortet und ich bin von MySqlConnector.net ausgegegangen. Jetzt sehe ich in deinem Stacktrace, dass Du die MySql.Data Implementierung verwendest. Na gut. Dann ziehe ich mir diese NuGet-Paketflut auch noch rein.
Ich habe doch ein transaction.Commit() drin
Ja, jetzt sieht man eins. Vorher nicht.
cmd.Transaction = transaction;muss innerhalb des try stehen.
Äh, wie bitte? Ob die Zuweisung an cmd.Transaction direkt vor oder direkt hinter dem try erfolgt, sollte komplett schnuppe sein. Das ist doch bloß ein Property, und im GitHub sieht man, dass da keine Logik in Setter ist, die eine Exception werden könnte. Da musst Du noch andere Dinge geändert haben.
Und da dein Code nur einmal BeginTransaction macht, muss der Fehler mit der nested transaction woanders her kommen. Startest Du noch anderswo Transaktionen, die Du zu beenden vergisst?
Aber das ist gar nicht wirklich das Problem.
Wenn ich versuche, deine Logik bei mir laufen zu lassen (also SELECT mit ExecuteReader ausführen und dann den Reader erstmal ignorieren und den CommandText auf DELETE ändern), bekomme ich eine von mir erwartete und sehr klar formulierte Exception (ich habe keinen try/catch drin):
Unhandled exception. System.InvalidOperationException: Cannot set
MySqlCommand.CommandText when there is an open DataReader for
this command; it must be closed first.
at MySqlConnector.MySqlCommand.set_CommandText(String value)
in /_/src/MySqlConnector/MySqlCommand.cs:line 207
at Program.<Main>$(String[] args)
in C:\Users\Rolf\source\repos\SqlConsoleApp1\Program.cs:line 41
Zeile 41 ist die Zuweisung des DELETE Statements an cmd.CommandText. Er kommt überhaupt nicht bis zum ExecuteNonQuery für den DELETE, er bricht ab weil das Command gerade vom Reader "in Arbeit" ist. Dass das bei Dir nicht passiert, ist höchst merkwürdig. Der Reader muss geschlossen sein (d.h. fertig eingelesen), bevor Du das Command wiederverwenden kannst. Und ihn nach dem Commit einzulesen kann auch nicht funktionieren.
Damit wir vergleichbare Umgebungen haben: Bei mir ist das ein Kommandozeilenprogramm unter Windows 10, mit .net 8, C# 12, MySqlConnector.net, gegen MariaDB 10.6, getestet mit einer InnoDB und eine MyISAM Tabelle.
Interessant ist: Ich habe erst später gemerkt, dass Du MySql.Data verwendest, nicht MySqlConnector.net. Da stürzt er auch ab, aber erst beim ExecuteNonQuery des DELETE.
Er müsste bei Dir also auch abstürzen. Auf welchem Betriebssystem und mit welcher .net Version programmierst Du da? Falls Du das nicht weißt: gib System.Environment.Version aus. Achso, welche MySql-Implementierung verwendest Du?
Rolf
sumpsi - posui - obstruxi