2013-09-30 15 views
11

Bir ASP.NET uygulaması yazıyorum. Veri tabanımda, sorgulamadan önce ve sonra bir sql bağlantısı açılmakta ve kapatılmaktadır. SqlConnection, tek bir sınıfın özel alanı olarak tutuluyor. Ben istisna 'bağlantı kapatılmadı olsun çok nadir durumlarda, HenüzBağlantı kapatılmadı, Bağlantının mevcut durumu açık

 conn.Open(); 

     try 
     { 
      // database querying here 
     } 
     finally 
     { 
      conn.Close(); 
     } 

: sınıftaki her veritabanı çağrı aynı yapıyı kullanır. Bağlantının mevcut durumu açıktır '. Sorunun çoğaltılması, kodun farklı bölümlerinden çok nadiren kaynaklandığından mümkün değildir. Uygulamamda bazı iş parçacıkları var ama yeni iş parçacıkları da yeni veri katmanı sınıfları ve dolayısıyla yeni bağlantı nesneleri oluşturuyor.

Yukarıdaki kodu kullanarak açıkta kalan bir bağlantının nasıl olabileceğini anlamıyorum. Bağlantı açıldıktan sonra daima kapatılmamalıdır, yukarıdaki istisnanın gerçekleşmesini imkansız kılar mı?

+1

Buradaki önemli şey, bağlantı nesnesinin kayıtsız kaldığı yer mi? –

+1

Ayrıca: 'using' kullanmada sorun nedir? –

+1

Bunun yerine bir kullanım bildirimi kullanın? Garanti, bağlantının kapatılıp bertaraf edilmesi. –

cevap

14

Büyük olasılıkla, işlem yapmadığınız try satırında bir istisna atılıyor olabilir. MSDN'de şu nota bakın: try-finally:

Bir ele alınan istisna dışında, ilişkili sonuncu bloğun çalıştırılması garanti edilir. Bununla birlikte, istisna işlenmemişse, sonuncu bloğun yürütülmesi, istisna açma işleminin nasıl tetiklendiğine bağlıdır.

Zaten bir using bloğunda bağlantı sarma öneriyoruz:

Alternatif
using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    //etc... 
} 

, try-finally bir catch bloğu ekleyin:

conn.Open(); 

    try 
    { 

    } 
    catch 
    { 

    } 
    finally 
    { 
     conn.Close(); 
    } 
+0

Teşekkürler, bu neden conn.Close() neden bazen çalıştırılmadığını açıklar. Bir şekilde, nihayetinde {} her zaman ne olursa olsun çalışacağına inanıyorum. – user2830395

+0

Sorun değil. Bu, sorunuzu cevaplarsa, diğer kullanıcıların benzer sorunlarla karşılaşmalarına yardımcı olmak için onu yanıt olarak işaretlemelisiniz. – DGibbs

+0

@ user2830395 Haklısınız, bir istisna olsa bile nihayet blok ne olursa olsun yürütür. Bu cevaptaki kod sorunu çözmüşse, başka bir faktör yüzünden olmuştur. – Doug

2

size en kısa sürede bağlantıları kapatmak gerekir operasyonlar bitti. Bağlantıları mümkün olan en kısa süre için açmaya çalışın. Bununla birlikte, 'u kullanarak kullanmak en iyisidir, istisnalar durumunda bile Dispose yöntemini çağırır.

using (SqlConnection conn= new SqlConnection(conStr)) 
{ 
    //etc... 
} 

VEYA

1) Açık bağlantısı

2) Access veritabanı

3) bağlantısını

kapatın
+1

Deneme içinde bir sorun varsa, bağlantıyı kapatmaz ... Nihayetinde kapatılmalıdır, yani bağlantının denemenin dışında bildirilmesi gerektiği anlamına gelir. – D3vy

+0

@ D3vy Teşekkürler, cevabımı düzenledim. –

İlgili konular