2011-12-23 9 views
5

Oto uproszczona wersja moim przykładzie:.Net: Czy moje połączenie zostanie zamknięte za pomocą opcji Utylizacja w tym przykładzie?

using (DbCommand cmd = new SqlCommand("myProcedure", (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) { CommandType = CommandType.StoredProcedure }) 
{ 
    cmd.Connection.Open(); 
    using(IDataReader dr = cmd.ExecuteReader()) 
     doWork(dr); 
} 

Gdy komenda jest umieszczona, jest połączenie zamknięte? A może potrzebowałbym tego pierwszego użycia instrukcji dla połączenia, a następnie utworzyć polecenie w zamknięciu?

Odpowiedz

11

Jeśli chcesz czytelnik, aby zakończyć połączenie, można użyć przeciążenie ExecuteReader():

... 
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
... 

Domyślnie umieszczenie czytnika nie zwalnia połączenie. - see MSDN for more info...

Aby rozwiązać kwestię Close() vs Dispose(), MSDN stwierdza:

Jeśli DbConnection wykracza poza zakres, nie jest zamknięty. Dlatego musisz jawnie zamknąć połączenie, wywołując Close lub Dispose, , które są funkcjonalnie równoważne.

Tak więc samozamykające się połączenie nie musi być koniecznie usuwane. Główną różnicą jest to, że zamknięte połączenie może zostać ponownie otwarte, ale rozłączone połączenie nie może. Główną dodatkową pracą, którą wykonuje Dispose(), jest ustawienie parametrów wewnętrznych na null, co nie będzie miało większego wpływu, ponieważ i tak połączenie będzie poza zasięgiem.

+0

Nie wierzę, że zrzuca połączenie, tylko je zamyka. –

+0

Czy to pozbędzie się połączenia? –

+0

Z MSDN wywołanie Close() i Dispose() na połączeniu są funkcjonalnie równoważne: –

4

Dzieła Jamesa Michaela Hare'a, ale będziesz również chciał pozbyć się swojego połączenia. Spróbuj tego:

using (SqlConnection conn = (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) 
using (DbCommand cmd = new SqlCommand("myProcedure", conn) { CommandType = CommandType.StoredProcedure }) 
{ 
    cmd.Connection.Open(); 
    using(IDataReader dr = cmd.ExecuteReader()) 
     doWork(dr); 
} 
3

Należy użyć

using(var connection = (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) 
{ 
connection.Open(); 
.... 
} 

Bo nawet jeśli zamknięcie połączenia, trzeba jeszcze, aby go zbyć. Zauważ, że SQLConnection wywołuje Close w Dispose. Problem polega na tym, że gdybyś musiał zadzwonić pod numer Close, musiałbyś umieścić go w try...catch, więc był gwarantowany i nie miałbyś przecieku pamięci. Istnieją inne typy w ramach, które nie nazywają się Close w Dispose, która moim zdaniem powinna być zapakowana.

+0

Dwa oznaczone "używane" w mojej odpowiedzi działa świetnie w tym przypadku. –

+0

@MikeC. Tak, chciałem tylko napisać o różnych implementacjach "Dispose". –

Powiązane problemy