2016-04-06 11 views
1

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(); 
    

Antwort

1

Betrachten wir eine using Anweisung

können Sie tatsächlich wickeln Sie Ihre vorhandenen dbConnection innerhalb einer using Anweisung, um sicherzustellen, dass sie sicher auf der (ähnlich angeordnet ist, wie Sie Ihre Transaktionen sind Handling, Befehle usw.):

//Open the SQL Connection 
using(var dbConnection = new MySqlConnection(GetConnectionString(WowDatabase)) 
{ 
     // Other code omitted for brevity 
} 

Konsequente String-Interpolation

Sie haben ein paar Stellen, an denen Sie einfach Strings über + verketten, aber Sie nutzen meistens die String-Interpolationsfunktion von C# 6. Vielleicht haben Sie es in Erwägung ziehen, überall mit:

string dataTableName = $"entry_{id}"; 

keine Notwendigkeit für Einstellung CommandType

Zusätzlich Sie die Einstellung Ihrer CommandType Eigenschaft für Ihr tatsächliches cmd Objekt als CommandType.Text entfernen könnten, ist der Standard:

//cmd.CommandType = CommandType.Text; 
+0

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? –

+0

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. –

2

Ich denke nicht, dass dies (wie erwartet) mit MySql funktionieren wird. Es gibt ein paar Anweisungen, die ein implizites Commit verursachen - CREATE TABLE ist einer von ihnen.

http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

+0

Interessant. Ich habe das von SQL CE umgestaltet und ich schätze, das kommt nicht wörtlich. Danke, dass Sie mich darauf aufmerksam gemacht haben! Ich habe eine Arbeit dafür mit "Select table_name from information_schema.tables". Funktioniert das in MySQL? –

+0

Ich sehe nicht, warum das nicht funktionieren würde. Nur wissen, dass die Tabelle erstellt wird, bevor Sie die 'transaction.Commit()' tun. –

+0

Ich habe missverstanden, was deine Antwort ursprünglich war. Danke, dass du darauf hingewiesen hast! –

Verwandte Themen