2010-08-23 27 views
13

tarafından kapatılmıştır. ExecuteNonQuery açık ve kullanılabilir bir Bağlantı gerektirir. Bağlantının mevcut durumu kapalı.ExecuteNonQuery açık ve kullanılabilir bir Bağlantı gerektirir. Bağlantının mevcut durumu

Burada yanlış olan ne yapıyorum? Bağlantıyı tekrar kullanabileceğini mi varsayıyorum?

Yardımlarınız için teşekkürler!

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString())) 
{ 
    cn.Open(); 

    // If we are reverting to an old type 
    if (pageAction == "revert") 
    { 
     debug.Text = "FLAG 1"; 

     // Get the revert ID 
     int revertingID = int.Parse(Request.QueryString["revID"]); 
     bool rowsReturned = false; 

     debug.Text = "FLAG 2 - " + revertingID.ToString(); 

     // Set all to 0 
     using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn)) 
     { 
      // If it exists 
      SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      if (rdr.Read()) 
      { 
       rowsReturned = true; 
      } 
      rdr.Close(); 
     } 

     debug.Text = "FLAG 3 - " + rowsReturned.ToString(); 

     // Set new active and reset others 
     if (rowsReturned == true) 
     { 
      using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 1 WHERE ID = " + revertingID, cn)) 
      { 
       cmd.ExecuteNonQuery(); 
      } 
      using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0 WHERE ID <> " + revertingID, cn)) 
      { 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     //debug.Text = "FLAG 4 - "; 
    } 

cevap

16

Senin sorunun şudur: "kurtulmak almak için tekrar öncesinde bağlantıyı kullanmak istiyorsanız

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

sadece cmd.ExecuteReader()' aramalısınız "onun. CommandBehaviour.CloseConnection bölümünün ne anlama geldiğini anlamak istiyorsanız, SqlCommand.ExecuteReader belgeleri iyi bir seçimdir. CommandBehaviour enumeration'un tüm olası değerlerinin neler olduğunu size anlatan belgeler de var. Esasen CommandBehaviour.CloseConnection yapar: komut yürütüldüğünde ilişkili DataReader nesnesi kapalıyken

, ilişkili Bağlantı nesnesi kapalıdır.

sonra, bir CommandBehaviour belirtmek ya CommandBehaviour.Default belirtin ya da hiç birini belirtmeyen için hiçbir özel ihtiyaç varsa. CommandBehaviour.Default:

Sorgu, birden çok sonuç kümesi döndürebilir. Sorgunun yürütülmesi veritabanı durumunu etkileyebilir. Varsayılan hiçbir CommandBehavior bayrağı ayarlar, böylece ExecuteReader (CommandBehavior.Default) çağrısı işlevsel olarak ExecuteReader() çağrısı ile eşdeğerdir.

+0

Using() deyiminin komutları SqlCommand'ı elden çıkardığında bağlantıyı da kapatır mı? – Tommy

+0

@Tommy, farkında olduğum kadarıyla değil - SqlCommand.Dispose dokümantasyonu bunu açıklamıyor, bu yüzden varsaymam (http://msdn.microsoft.com/en-us/library/system .data.sqlclient.sqlcommand.dispose.aspx) – Rob

+0

Bağlantı tanımı Bağlantı bloğuna sarılırsa iyi bir çağrı olur. http://stackoverflow.com/questions/410222/does-connection-close-when-command-is-disposed-and-the-connection-is-defined-dire – Tommy

5

Bunu ExecuteNonQuery() çağırmadan önce yeniden açılıyor asla bağlantıyı rdr.Close(); kapatarak ve ediyoruz.

Dispose() numaralı çağrı, sizin için bağlantıyı otomatik olarak kapatacaksa, bir using içine sarılmışsa, onu kapatmanız gerekmez.

4

ExecuteNonQuery'nizi yapmadan önce bir okuma yapıyorsunuz. SqlCommand'a ilk çağrıda (SELECT için), okuma tamamlandıktan sonra bağlantıyı kapatıyorsunuz.

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

gitmek veya bir sonraki eğer açıklamada bağlantıyı yeniden açmak için iyi olmalı, komut davranışını çıkarın.

Bu

SqlDataReader rdr = cmd.ExecuteReader(); 

Ya da bu

if (rowsReturned == true){ 
    cn.open(); 
1

Tam burada, bu tamamlandığında bağlantıyı kapanacak sizin SqlDataReader:

// Set all to 0 
using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn)) 
{ 
    // If it exists 
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    if (rdr.Read()) 
    { 
     rowsReturned = true; 
    } 
    rdr.Close(); 
} 

Daha sonra bağlantı kapalı olduğundan bölüm, başarısız olur "aktif yeni ayarlayın ve diğerlerini reset".

2

Önceden cn.Open ekleyin veya kapatmayın.

İlgili konular