2016-03-30 13 views
2

Her şey başlığında.C#, Okurken SQL Server tablosundan INSERT ve SİLİNİZİ OK

SqlCommand sonucunu okudum (bu tablo1 ve tablo2'nin birleşim sorgusudur).

using (SqlCommand cmd = new SqlCommand(sqlCommand, eve.Database)) 
    { 
     using (SqlDataReader sdr = cmd.ExecuteReader()) 
     { 
      //Performing some tasks 
     } 
    } 

Aslında "bazı görevleri yerine" kısmen, benim katılmak masanın birinde bazı INSERT ve DELETE (biz örneğin table1 bahsedeceğiz) yapmak.

Şu anda bir şirkette stajyerlik yapıyorum, kod az miktarda veriyle çalışıyor, ancak öğretmenim bunun iyi bir fikir olmadığını söylüyor çünkü benim masada okuma ve yazma konusunda bazı problemlerim olabiliyor çünkü SQL Server kilitler.

INSERT ve DELETE'imi tetiklemek için bunu eklerim, sadece yeni bir bağlantı açıyorum (bu yüzden ana bağlantıyı kullanmıyorum) ve ExecuteNonQuery() numaralı çağrıyı çalıştırıyorum.

using (SqlConnection cnx = Piivo.Utils.Open(Configuration)) 
{ 
    SqlCommand cmd = new SqlCommand(command, cnx); 
    cmd.ExecuteNonQuery(); 
} 
+0

Tabii ki sorum şu: Bu özel durumda bazı kilitler olabilir mi? Veya "ExecuteNonQuery" kilitlemeyi engelleyebilir mi? Ve bunu yapmanın iyi bir yolu mu? – Pyr0technicien

+0

Kilitlemeye başlamak derin bir dalıştır ve ilgili sorgulara, verilere ve ayarlara çok bağlıdır. Bu söyleniyor ki, modern RDBMS eşzamanlı okuma/yazma işlemlerini yürütmek için çok şey yapılıyor. Kilitleme davranışı istediğin şey değilse, o zaman daha spesifik bir soruyla geri dönmelisin. – dbugger

+0

SQL Server ** kilitler yerleştirir - 'SELECT' satırlarına "paylaşılan" kilitler, ** özel ** eklediğiniz veya sildiğiniz satırları kilitler. Ama bu SQL Server normal ** satır düzeyinde ** kilitlediğinden bu yana, sadece iyi çalışır, - bireysel satırlar kilitlenir - tablo yok. Tek bir işlemde tek bir tabloda 5000'den fazla ekleme ve/veya silmediğiniz sürece - eğer yaptıysanız, SQL Server * bir tablo düzeyi kilidine kilitlenecek * ve bir tablo düzeyinde * artacaktır ** özel ** kilit, o masadan olmasından * bir şey * önler –

cevap

0

, ikisi de bir yürütme beri yalnızca ve Select komutunun tamamlanması ise Yapabilirsin, ancak takmadan veya seçme komutu hâlâ çalışıyor ise, aynı masada silemezsiniz SqlCommand, "tek" açık bir bağlantıya ihtiyaç duyan belirli bir tabloda.

0

Şu an büyük veri setinde bunu test edemediğimi bildiğimden, kendimi bu kilitlerden korumam gerekecek. Sanırım SELECT seçeneğimin sonucunu DataTable nesnesine kaydetmem gerekiyor, bağlantımı kapatıyorum ve daha sonra güvenli bir şekilde INSERT ve DELETE yapabileceğim. Ancak bu SELECT'te çok fazla sonuca sahip olabilirim, bu çözümün optimal olup olmayacağından emin değilim ama seçimim yok.

Açıklamalar için teşekkürler.

+0

Ve bir şey daha var, DataTable'ımın bir sütununu belirli bir değişkene almak için bir cast kullanmalıyım: (Guid) row [1]; SqlDataReader ın ınternet yöntemi yerine, örneğin: mySqlDataReader.getGuid (1); Dün okudum, optimizasyon açısından iyi bir fikir değil ... – Pyr0technicien

+0

Bazı perfs testlerinden sonra, tedavi süresi üzerinde bir etkisi yok gibi görünüyor. – Pyr0technicien