Ich hoffe, jemand könnte meinen Kontext überprüfen, wie ich Transaction mit MySql verwende. Ich glaube, das sollte mit der folgenden Gliederung funktionieren. Kann jemand meinen Code ansehen und mir sagen, ob ich es richtig mache? Vielen Dank.MySQL -> Transaktionskontext -> Code Review
Ich glaube, dies sollte:
- Instantiate die DB-Verbindung.
- Iterieren durch die DataTable-Zeilen der angegebenen DataTable.
- Überprüfen Sie, ob die Tabelle vorhanden ist, und wenn dies nicht der Fall ist, führen Sie Create Table aus.
- Führen Sie den Befehl Einfügen mit Informationsparametern in die neu erstellte oder vorhandene Tabelle aus.
Commit die Transaktion und dann die Verbindung schließen.
//Open the SQL Connection var dbConnection = new MySqlConnection(GetConnectionString(WowDatabase)); dbConnection.Open(); //Instantiate the Command using (var cmd = new MySqlCommand()) { //Create a new Transaction using (var transaction = dbConnection.BeginTransaction()) { uint lastId = 999999; for (int i = 0; i < dt.Rows.Count; i++) { //var identifier = dt.Rows[i].Field<int>("Identifier"); var id = dt.Rows[i].Field<uint>("Entry"); var name = dt.Rows[i].Field<string>("Name"); var zone = dt.Rows[i].Field<uint>("ZoneID"); var map = dt.Rows[i].Field<uint>("MapID"); var state = dt.Rows[i].Field<Enums.ItemState>("State"); var type = dt.Rows[i].Field<Enums.ObjectType>("Type"); var faction = dt.Rows[i].Field<Enums.FactionType>("Faction"); var x = dt.Rows[i].Field<float>("X"); var y = dt.Rows[i].Field<float>("Y"); var z = dt.Rows[i].Field<float>("Z"); string dataTableName = "entry_" + id; //Create Table if it does not exist. if (id != lastId) { cmd.CommandText = $"CREATE TABLE IF NOT EXISTS `{dataTableName}` (" + "`identifier` int NOT NULL AUTO_INCREMENT COMMENT 'Auto Incriment Identifier' ," + "`zone_id` int NULL COMMENT 'Zone Entry' ," + "`x_axis` float NULL COMMENT 'X Axis on Map' ," + "`y_axis` float NULL COMMENT 'Y Axis on Map' ," + "`z_axis` float NULL COMMENT 'Z Axis on Map' ," + "`situation` enum('') NULL COMMENT 'Location of the item. Underground, Indoors, Outdoors)' ," + "`faction` enum('') NULL COMMENT 'Specifies the Faction which can safely access the item.' ," + "PRIMARY KEY(`identifier`)" + ")"; cmd.ExecuteNonQuery(); lastId = id; } //Create command to execute the insertion of Data into desired Table cmd.CommandText = $"INSERT INTO [{dataTableName}] " + "([identifier], [zone_id], [x_axis], [y_axis], [z_axis], [situation], [faction], [Create_Date], [Update_Date]) " + "VALUES (@Identifier, @Zone_Id, @X_Axis, @Y_Axis, @Z_Axis, @Situation, @Faction, @Create_Date, @Update_Date)"; //Add data value with Parameters. cmd.CommandType = CommandType.Text; //cmd.Parameters.AddWithValue("@Identifier", identifier); cmd.Parameters.AddWithValue("@Identifier", id); cmd.Parameters.AddWithValue("@Zone_Id", zone); cmd.Parameters.AddWithValue("@X_Axis", x); cmd.Parameters.AddWithValue("@Y_Axis", y); cmd.Parameters.AddWithValue("@Z_Axis", z); cmd.Parameters.AddWithValue("@Situation", state); cmd.Parameters.AddWithValue("@Faction", faction); cmd.Parameters.AddWithValue("@Create_Date", DateTime.Now.Date); cmd.Parameters.AddWithValue("@Update_Date", DateTime.Now.Date); cmd.ExecuteNonQuery(); } //for (int i = 0; i < dt.Rows.Count; i++) //Commit the Transaction transaction.Commit(); } //using (var transaction = dbConnection.BeginTransaction()) } //using (var cmd = new MySqlCommand()) //Close the Connection dbConnection.Close();
Vielen Dank dafür, ich habe die Änderungen hinzugefügt. Also Syntax beiseite, war meine Verwendung von Transaktion korrekt? Würde es die sql-Befehle in der Iteration ausführen und sie dann committieren, sobald die for-Schleife fertig ist? –
Nehmen wir an, dass das Problem, das John aufbrachte, kein Problem ist (da die Commits durch die Aufrufe von "CREATE TABLE" ausgelöst werden), sieht es gut aus. –