2008-09-19 12 views
5

Jeśli chcesz otworzyć SqlConnection przed wysłaniem zapytania, czy możesz po prostu obsłużyć wszystkie nieprzyłączone punkty połączenia w ten sam sposób? Na przykład:Obsługa różnych stanów połączeń przed otwarciem SqlConnection

if (connection.State != ConnectionState.Open) 
    { 
     connection.Open(); 
    } 

Czytałem gdzieś, że dla ConnectionState.Broken połączenie musi zostać zamknięty przed jego ponownym otwarciu. Czy ktoś ma z tym doświadczenie? Dziękujemy-

Odpowiedz

5

http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx

Złamane stan połączenia musi być zamknięte i otwarte przed kwalifikują się do dalszego użytkowania.

Edycja: Niestety zamknięcie zamkniętego połączenia również się nie powiedzie. Przed połączeniem z nieznanym połączeniem należy przetestować moduł ConnectionState. Być może krótka instrukcja zmiany może załatwić sprawę.

4

Nie odpowiada to bezpośrednio na twoje pytanie, ale najlepszą praktyką jest otwieranie i zamykanie połączenia dla każdego dostępu do bazy danych. Pule połączeń ADO.NET zapewniają, że to działa dobrze. Szczególnie ważne jest to w aplikacjach serwerowych (np. ASP.NET), ale robiłbym to nawet w aplikacji WinForm, która bezpośrednio uzyskuje dostęp do bazy danych.

Przykład:

using(SqlConnection connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    // ... do your stuff here 

} // Connection is disposed and closed here, even if an exception is thrown 

W ten sposób nigdy nie trzeba sprawdzić stan połączenia podczas otwierania połączenia.

+0

Nie należy czekać na GC, aby zamknąć i utylizować połączenia. Po zakończeniu korzystania z niego należy jawnie zamknąć połączenie. – ddc0660

+0

Instrukcja using zapewnia, że ​​połączenie zostanie zamknięte, nawet jeśli zostanie zgłoszony wyjątek. Nie czeka, aż GC je zamknie. – Joe

+1

Ten wzorzec użycia określa, jak powinien wyglądać dostęp do danych. W ten sposób nigdy nie będziesz przeciekać połączeń. Joe, dodałbym również "using (SqlCommand command ...") wewnątrz funkcji SqlConnection i polecam stałą dla ciągu zapytania, aby upewnić się, że zawsze pochodzi ona z tej samej puli. –

3

Możesz sobie z tym poradzić w taki sam sposób. Otrzymałem wiele stanów połączenia == zerwanych podczas używania IE9. W IE9 jest coś z gruntu nie tak pod tym względem, ponieważ żadna inna przeglądarka nie miała problemu z uszkodzonymi stanami połączenia po 5 lub 6 aktualizacjach tabel bazy danych. Używam kontekstu obiektu. Więc po prostu zamknij i ponownie otwórz.

Mam ten kod, zanim wszystkie moje odczyty i aktualizacje w warstwie logicznej businss:

if (context.Connection.State == System.Data.ConnectionState.Broken) 
{ 
    context.Connection.Close(); 
    context.Connection.Open(); 
} 
Powiązane problemy