2012-02-23 29 views
6

SQL ile birden çok satırı güncelleştirmenin etkili bir yolu hakkında bir sorum var.C#, SQL çoklu satırları güncelleştirin

Basiclly i farklı ROWIDs çalıştırmak için gereken bir sorgu var:

UPDATE TableName SET Column = (some number) WHERE RowID = (some number) 

bu daha iyi bir örnektir daha belirgin olmak üzere, eğer:

UPDATE TableName SET Column = 5 WHERE RowID = 1000 
UPDATE TableName SET Column = 10 WHERE RowID = 1001 
UPDATE TableName SET Column = 30 WHERE RowID = 1002 
.. 

nasıl olmalıdır bilmek istiyorum C# üzerinde güncelleme sorgusu komutunu yapıyorum (ya da sadece almam gereken sonuçların bir örneğini vereyim) böylece ExecuteQuery'yi kullandıktan sonra, bu komutların tümünü tek bir parçada çalıştıracak ve her komutu çalıştırarak değil. Düzenlenen

: başka sorun var, ayrıca dinamik durum hakkında hangi i güncellemek istediğiniz satırı necessarly değil ne açıklayabilir bu durumda ben yerine güncelleme eklemek gerekir, zaten mevcut. Daha iyi açıklamak için, geri örneğe satır varsa yani ben güncelleştirmeyi kullanmayı tercih ederseniz aksi ı eklemek gerekecek, kontrol etmek gerektiğidir i

UPDATE TableName SET Column = 5 WHERE RowID = 1000 
INSERT INTO TableName [RowID, Column] VALUES (1001, 20) 
UPDATE TableName SET Column = 30 WHERE RowID = 1002 
.. 

Bunun anlamı yapmak istiyorum diyelim o.

Teşekkür ederiz!

+0

Saklı yordam? – Vedran

+0

Kullandığınız veritabanı ürün ve sürümünü doğrulayabilir misiniz? Modern SQL Server (> = 2008) için, tablo değerli bir parametre ve bir "MERGE" ifadesi –

cevap

7

Sen kayıtları saklamak için bir DataTable kullanabilirsiniz, insert, delete veya satırları değiştirebilir ve SqlDataAdapter en UpdateBatchSize (0 sınır anlamına gelir) kullanılarak bir toplu tüm değişiklikleri güncelleştirmek:

public static void BatchUpdate(DataTable dataTable,Int32 batchSize) 
{ 
    // Assumes GetConnectionString() returns a valid connection string. 
    string connectionString = GetConnectionString(); 

    // Connect to the AdventureWorks database. 
    using (SqlConnection connection = new 
     SqlConnection(connectionString)) 
    { 

     // Create a SqlDataAdapter. 
     SqlDataAdapter adapter = new SqlDataAdapter(); 

     // Set the UPDATE command and parameters. 
     adapter.UpdateCommand = new SqlCommand(
      "UPDATE Production.ProductCategory SET " 
      + "[email protected] WHERE [email protected];", 
      connection); 
     adapter.UpdateCommand.Parameters.Add("@Name", 
      SqlDbType.NVarChar, 50, "Name"); 
     adapter.UpdateCommand.Parameters.Add("@ProdCatID", 
      SqlDbType.Int, 4, "ProductCategoryID"); 
     adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; 

     // Set the INSERT command and parameter. 
     adapter.InsertCommand = new SqlCommand(
      "INSERT INTO Production.ProductCategory (Name) VALUES (@Name);", 
      connection); 
     adapter.InsertCommand.Parameters.Add("@Name", 
      SqlDbType.NVarChar, 50, "Name"); 
     adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; 

     // Set the DELETE command and parameter. 
     adapter.DeleteCommand = new SqlCommand(
      "DELETE FROM Production.ProductCategory " 
      + "WHERE [email protected];", connection); 
     adapter.DeleteCommand.Parameters.Add("@ProdCatID", 
      SqlDbType.Int, 4, "ProductCategoryID"); 
     adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; 

     // Set the batch size. 
     adapter.UpdateBatchSize = batchSize; 

     // Execute the update. 
     adapter.Update(dataTable); 
    } 
} 

http://msdn.microsoft.com/en-us/library/aadf8fk2.aspx

Dbms'nin dahili olarak nasıl çalıştığını yanlış anlıyorsunuz. Bu

UPDATE TableName SET Column = 5 WHERE RowID = 1000; 
UPDATE TableName SET Column = 5 WHERE RowID = 1002; 

Tabloda her kayıt etkileyecek UPDATE table SET value=1 gibi bir ifade yazardı bile vtys zaten tüm etkilenen kayıtları teker teker güncelleyecek

UPDATE TableName SET Column = 5 WHERE RowID IN(1000,2002); 

aynıdır. Tek bir toplu işlemde güncellendiğinizde, tüm güncellemelerin (silme, ekleme), her bir ifade için tek bir gidiş yerine veritabanına gönderilmesini sağlarsınız.

+0

kullanarak bakıyorum. Güncelleme kodunu görüntüliyorum (çünkü bu soruyla en alakalı olduğu için) ve ben yapmadım. Sonunda sonuçta sorulan soru nedir ve neden verimli? senin gibi bir şey yapmıyormuş gibi görünmekten kaçınmaya çalışıyorum. – Popokoko

+1

dbms tablodaki her kaydı etkileyecek olan 'UPDATE tablo SET değeri = 1' gibi bir ifade yazsanız bile etkilenen tüm kayıtları tek tek güncelleştirecektir.Tek bir toplu iş güncellemesi yaparak, tüm güncellemelerin (silme, ekleme) aynı işlemde aynı anda yapılmasını sağlarsınız. –

+0

Güncelleştirmeler (dataTable) 'ın [documented] (http://msdn.microsoft.com/en-us/library/z1z2bkx2.aspx) güncellemelerini toplu olarak yapmaması gerektiğini belirtmeliyiz:“ Bunlara dikkat edilmelidir. ifadeleri toplu işlem olarak gerçekleştirilmez; her satır tek tek güncelleştirilir. "ve bu toplu işlem ve işlemler SQL'de iki dikey kavramdır. –

0

Kullanım MERGE:

MERGE INTO TableName 
    USING (
      VALUES (1000, 5), 
       (1001, 10), 
       (1002, 30) 
     ) AS source (RowID, Column_name) 
     ON TableName.RowID = source.RowID 
WHEN MATCHED THEN 
    UPDATE 
     SET Column_name = source.Column_name 
WHEN NOT MATCHED THEN 
    INSERT (RowID, Column_name) 
     VALUES (RowID, Column_name); 

yerine sabit kodlama/dinamik SQL, MERGE deyimi bir table-valued parameter alır saklı yordam içine kapsüllü olabilir.

İlgili konular