Hallo,
es tut mir leid, dass ich euch damit nerve, aber ich komme einfach nicht mehr weiter :'( :'(
Seit zwei Tagen versuche ich dieses Problem zu lösen, doch ohne Erfolg
Ich habe schon zwei Themen eröffnet, wo meine Problem "gelöst" war, doch nun ein neues Problem (
Thema 1 und
Thema 2).
Ich bin gerade dabei mehre Aktionen auf meiner Datenbank durchzuführen, diese möchte ich mittels Transaction überwachen. Da ich mehrere Connections habe wollte ich zunächst TransScoup benutzen. Doch dort kam es immer wieder zu Fehlermeldung, dass die Transaktion schon benutzt wurde :/ diese konnte ich nicht beheben.
Dann dachte ich mir versuche ich verschide Transaktionen zu erstellen, so wie es mir Ralf Jansen gezeigt hat. Doch das Problem ist ich benutze zunächst ein DataReader um Datensätze in Variablen zu speichern und diese dann erst einzufügen, ich zeig euch mal Code, damit ihr versteht wie ich es meine...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| string conn1 ="meinconn1", conn2 ="meinconn2";
SqlConnection deleteConn = new SqlConnection(conn1); SqlConnection insert1Conn = new SqlConnection(conn2); SqlConnection insert1ZielConn = new SqlConnection(conn1); SqlConnection insert2Conn = new SqlConnection(conn2); SqlConnection insert2ZielConn = new SqlConnection(conn1); SqlConnection updateConn = new SqlConnection(conn1); SqlConnection updateZielConn = new SqlConnection(conn1);
deleteConn.Open(); insert1Conn.Open(); insert1ZielConn.Open(); insert2Conn.Open(); insert2ZielConn.Open(); updateConn.Open(); updateZielConn.Open();
deleteTransaction = deleteConn.BeginTransaction(); insert1Transaction = insert1Conn.BeginTransaction(); insert1toZielTransaction = insert1ZielConn.BeginTransaction(); insert2Transaction = insert2Conn.BeginTransaction(); insert2toZielTransaction = insert2ZielConn.BeginTransaction(); updateTransaction = updateConn.BeginTransaction(); updateURLZielTransaction = updateZielConn.BeginTransaction();
SqlCommand deleteCMD = new SqlCommand(); deleteCMD.Transaction = deleteTransaction; deleteCMD.Connection = deleteConn;
SqlCommand insert1CMD = new SqlCommand(); insert1CMD.Transaction = insert1Transaction; insert1CMD.Connection = insert1Conn; SqlCommand insert1ZielCMD = new SqlCommand(); insert1ZielCMD.Transaction = insert1toZielTransaction; insert1ZielCMD.Connection = insert1ZielConn;
SqlCommand insert2CMD = new SqlCommand(); insert2CMD.Transaction = insert2Transaction; insert2CMD.Connection = insert2Conn; SqlCommand insertFCZielCMD = new SqlCommand(); insert2ZielCMD.Transaction = insert2toZielTransaction; insert2ZielCMD.Connection = insert2ZielConn;
SqlCommand updateCMD = new SqlCommand(); updateCMD.Transaction = updateTransaction; updateCMD.Connection = updateConn; SqlCommand updateZielCMD = new SqlCommand(); updateZielCMD.Transaction = updateURLZielTransaction; updateZielCMD.Connection = updateZielConn; |
SO fängt mein Code an, es wird alles zunächst zugewisen, jetzt arbeite ich in einzelnen #region die Punkte ab:
BSP zeig ich euch jetzt den INSERT 2
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| #region Insert 2
insert2CMD.CommandTimeout = 240;
insert2CMD.CommandText = "SELECT-QUERY";
using (SqlDataReader reader2 = insert1CMD.ExecuteReader()) { while (reader2.Read()) { if (!reader2.IsDBNull(0)) strE = Convert.ToString(reader2[0]); else strE = ""; if (!reader2.IsDBNull(1)) strAcc = Convert.ToString(reader2[1]); else strAcc = ""; intAcc = int.Parse(strAcc.Trim().Trim('I'));
if (!reader2.IsDBNull(2)) strKun = Convert.ToString(reader2[2]); else strKun = ""; if (!reader2.IsDBNull(3)) strKon = Convert.ToString(reader2[3]); else strKon = "";
#region ZielDatenbank einfügen
insert2ZielCMD.CommandTimeout = 240; insertFCZielCMD.CommandText = "INSERT - QUERY";
if (strE == "") insert2ZielCMD.Parameters.AddWithValue("@e", DBNull.Value); else insert2ZielCMD.Parameters.AddWithValue("@e", strE );
if (intAcc == 0) insert2ZielCMD.Parameters.AddWithValue("@kun", DBNull.Value); else insert2ZielCMD.Parameters.AddWithValue("@kun", intAcc );
if (strKun == "") insert2ZielCMD.Parameters.AddWithValue("@kunde", DBNull.Value); else insert2ZielCMD.Parameters.AddWithValue("@kunde", strKun );
if (strKon == "") insert2ZielCMD.Parameters.AddWithValue("@kon", DBNull.Value); else insert2ZielCMD.Parameters.AddWithValue("@kon", strKon );
insert2ZielCMD.ExecuteNonQuery();
#endregion } }
#endregion |
Die variablen erstelle ich ausserhalb der Methode, sodass sie immer nur neu gefüllt werden.
Doch wenn ich das jetzt so ausführe, bleibt er beim insert2ZielCMD.ExecuteNonQuery() hängen, er bleibt da solange bis die Exception kommt, dass ein Command-Timeout passiert ist!
Von solchen Region habe ich 3 stück, dort lade ich die Datensätze in Variable und passe sie an und dann werden sie mittels Insert-Query zurück geschrieben.
Das packe ich in ey try und am ende des try mache ich ein commit(), was aber nie erreicht wird.
Ich hoffe jemand kann mir helfen.
Lg
PS.: Wenn ich das so aufbaue wie Ralf Jansen mir das in Thema 1 gezeigt hat, muss ich die Transaction mit unterschiedlichen Connection in die schleife packen.