2016-04-06 17 views
1

Birinin MySql ile İşlem'i nasıl kullandığımı bağlamıma bakabileceğini umuyorum. Bunun aşağıdaki ana hatlarıyla çalışması gerektiğine inanıyorum. Birisi benim koduma bakıp bana doğru bir şekilde yapıp yapmadığımı söyler mi? Teşekkür ederim. MySQL -> İşlem İçeriği -> Kod İncelemesi

bu should inanıyoruz:

  • örneğini db bağlantısı.
  • Verilen DataTable'ın DataTable satırlarını yineleyin.
  • Tablonun var olup olmadığını ve eğer yapmıyorsa Tablo Oluştur'u Yürütme olup olmadığını kontrol edin.
  • Ekleme komutunu yeni oluşturulan veya var olan tabloya bilgi parametresiyle uygulayın.
  • İşlemi gerçekleştirin ve ardından bağlantıyı kapatın.

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

cevap

1

bir using deyimini

Aslında sarmak edebilirsiniz güvenle size işlemlerin kullanımı nasıl benzer (atıldığından emin olmak için bir using ifadesi içinde dbConnection mevcut, komutları düşünün vb):

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

Tutarlı Dize İnterpolasyon

Sen sadece + aracılığıyla dizeleri bitiştirmek birkaç noktalar var ama çoğunlukla C# 6'nın Dize İnterpolasyon özelliği yararlanılmaktadır. Her yerde bunu kullanarak düşünebilirsiniz:

string dataTableName = $"entry_{id}"; 

Gerek Yok CommandType

Ayrıca ayarlama için, size CommandType.Text olarak gerçek cmd nesne için CommandType özelliğinin ayarı kaldırabilir varsayılan:

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

Bunun için teşekkürler, değişiklikleri ekledim. Yani, sözdizimi bir kenara, İşlemi kullanmam doğru muydu? Yineleme ile sql komutlarını yürütür ve sonra döngü için tamamlandığında bunları işler mi? –

+0

John'un ortaya çıkardığı sorunun bir sorun olmadığını varsayarak (CREATE TABLE çağrıları tarafından tetiklenen işlemlerle), iyi görünüyor. –

2

Bunun, MySql ile (beklendiği gibi) çalışacağını sanmıyorum. Örtülü bir işlemeye neden olan birkaç ifade var - CREATE TABLE bunlardan biri.

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

+0

İlginç. Bunu SQL CE'den yeniden yapılandırıyordum ve sanırım bu, sözün üzerine gelmiyor. Bu hususları dikkatime sunduğunuz için teşekkür ederim! Bunun için "information_schema.tables adresinden tablo_adı seç" seçeneğini kullanarak çalışıyorum. Bu MySQL'de çalışacak mı? –

+0

Bunun neden işe yaramadığını anlamıyorum. Sadece tablonun 'transaction.Commit()' yapmadan önce oluşturulacağını bilin. –

+0

İlk başta cevabın ne olduğunu yanlış anladım. Bunu işaret ettiğin için teşekkürler! –

İlgili konular