2013-07-09 20 views
16

OK, więc jest to jeden z takich poglądów, ale na podstawie wiedzy, opinii i aktualnej praktyki, jaki jest najlepszy sposób na ustawienie następującego scenariusza?C# Połączenia danych Najlepsza praktyka?

Buduję obszerną aplikację do wprowadzania danych, i przez rozległe mam na myśli, że mam tylko podstawowe ustawienia, które obejmują około 15-25% całego programu i mam około 15 formularzy, które są częściowo skonfigurowane. (Nadal potrzebują pracy) Używam SQL Compact 4.0 jako bazy danych backendu, tak naprawdę nie potrzebuję bardziej rozbudowanej bazy danych, ponieważ nie przechowuję wartości danych MMO, a na razie jest to tylko aplikacja lokalna .

Chciałbym móc ustawić go tak, aby był wyświetlany jako pojedyncze okno, które zmienia się na różne strony w oparciu o system menu, ale nie mogę znaleźć dobrego samouczka na temat tego, jak to będzie osiągnięte, więc jeśli ktokolwiek o tym wie, proszę, oświeć mnie.

Scenariusz, o którym mowa, jest jednak, jak połączyć się z bazami danych. Używam 2 baz danych SQLCE, które przechowują stałe dane oparte na usługach i personelu, a także drugą, która przechowuje stale zmieniające się dane lub nowe dane wprowadzone na podstawie pierwszej bazy danych. Widziałem wiele różnych metod, jak to ustawić i obecnie używam tego, w którym mam BaseForm, z którego dziedziczą wszystkie inne formy. W BaseForm mam metody i zmienne, które są wspólne dla wielu form, co minimalizuje ilość kodu, który jest powtarzany.

Obejmuje to ciągi połączeń obu baz danych i 2 metody, które otwierają połączenie z jednym z nich. Tak:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf"); 
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf"); 
internal SqlCeCommand command; 

internal void openDataConnection() // Opens a connection to the data tables 
     { 
      try 
      { 
       if(dataConn.State == ConnectionState.Closed) 
        dataConn.Open(); 
      } 
      catch(SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

     internal void openLogConnection() // Opens a connection to the log tables 
     { 
      try 
      { 
       if(logConn.State == ConnectionState.Closed) 
        logConn.Open(); 
      } 
      catch (SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

Potem ilekroć muszę otwarte połączenie po prostu wywołać metodę otwarte połączenie, które odpowiada bazy muszę dostęp do, a następnie zamknąć ją w finally. W ten sposób połączenie nigdy nie jest otwarte przez bardzo długi czas, gdy jest to potrzebne. Oczywiście oznacza to, że jest wiele połączeń z metodami otwartego połączenia. Więc czy jest to najlepszy sposób na wdrożenie tego rodzaju scenariusza, czy istnieją lepsze sposoby?

Czy lepiej jest po prostu otworzyć połączenie natychmiast po załadowaniu formularza, a następnie zamknąć je po zamknięciu formularza? Mam instancje, w których wiele formularzy jest otwartych na raz, a każdy z nich prawdopodobnie musiałby mieć otwarte połączenie z bazami danych, więc jeśli je zamkniemy, pozostałe zostaną wkręcone w prawo? Czy powinienem otworzyć połączenie z obydwoma bazami danych po uruchomieniu aplikacji? Dowolne wejście będzie docenione. Dzięki.

+1

Zobacz pytanie na Oświadczenie o korzystaniu http://stackoverflow.com/q/212198/1193596 – Amicable

Odpowiedz

51

Połączenia są łączone przez .NET, więc ich ponowne utworzenie nie jest na ogół kosztowną operacją. Pozostawienie otwartych połączeń przez dłuższy czas może jednak powodować problemy.

Większość "najlepszych praktyk" mówi nam, aby otworzyć połączenia tak późno, jak to możliwe (tuż przed wykonaniem dowolnego SQL) i zamknąć je tak szybko, jak to możliwe (zaraz po wyodrębnieniu ostatniego fragmentu danych).

Skutecznym sposobem osiągnięcia tego celu jest automatycznie z using stwierdzeń:

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    using(SqlCommand cmd = new SqlCommand(..., conn)) 
    { 
     conn.Open(); 
     using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc.  
     { 
      ... 
     { 
    } 
} 

ten sposób zasoby są zamykane i usuwane, nawet jeśli jest wyjątek.

Krótko mówiąc, otwarcie połączenia podczas otwierania aplikacji lub przy każdym otwieraniu formularza prawdopodobnie nie jest najlepszym rozwiązaniem.

+0

Dziękuję, rozważałem dodanie instrukcji użycia i usunięcie otwartych metod połączenia, jako czystszego i wydajniejszego sposobu tworzenia połączeń. Po prostu nie udało mi się wyczyścić mojego kodu. Po prostu używając metod try/catch do testowania. –

-10

Myślę, że lepiej jest po prostu otworzyć je po uruchomieniu aplikacji, ponieważ potrzebujesz rzeczy z bazy danych, prawda? Nie jestem ekspertem w tym, to tylko moja opinia ... Zaprogramowałem kilka podobnych aplikacji i zrobiłem połączenie na początku głównego formularza. Jedyną formą, w której utworzyłem osobne połączenie, był formularz logowania.

+7

Proszę nie zamieszczać spekulacyjnych odpowiedzi, istnieją w rzeczywistości najlepsze praktyki zalecane przez firmę Microsoft do naśladowania. – Mgetz

+0

@Mgetz masz rację, ponieważ jest to spekulacja i są zdecydowanie standardy, które według mnie powinny być przestrzegane. Ważną rzeczą, którą należy im zabrać, jest to, że tylko dlatego, że jest standardem, nie nadaje się do twojego oprogramowania. Jeśli to sprawiło, że twój system był lepszy, jak to się stało? To wywołałoby o wiele lepszą dyskusję. Mam kilka aplikacji, które napisałem z otwartym połączeniem z bazą danych, dopóki nie zostanie wykonane, ale nie bez powodu. –

Powiązane problemy