Przewodnik: tworzenie aplikacji danych n-warstwowej przy użyciu ADO.NET i programu .NET Framework
Uwaga
Zestawy danych i powiązane klasy to starsze technologie .NET Framework z początku 2000 roku, które umożliwiają aplikacjom pracę z danymi w pamięci, gdy aplikacje są odłączone od bazy danych. Technologie te są szczególnie przydatne w przypadku aplikacji, które umożliwiają użytkownikom modyfikowanie danych i utrwalanie zmian z powrotem w bazie danych. Mimo że zestawy danych okazały się bardzo udaną technologią, zalecamy, aby nowe aplikacje platformy .NET używały platformy Entity Framework Core. Program Entity Framework zapewnia bardziej naturalny sposób pracy z danymi tabelarycznymi jako modelami obiektów i ma prostszy interfejs programowania.
Aplikacje danych n-warstwowe to aplikacje, które uzyskują dostęp do danych i są oddzielone wieloma warstwami logicznymi lub warstwami. Rozdzielenie składników aplikacji na warstwy dyskretne zwiększa łatwość konserwacji i skalowalność aplikacji. W ten sposób można łatwiej stosować nowe technologie, które można zastosować do pojedynczej warstwy bez konieczności przeprojektowania całego rozwiązania. Architektura N-warstwowa obejmuje warstwę prezentacji, warstwę środkową i warstwę danych. Warstwa środkowa zazwyczaj obejmuje warstwę dostępu do danych, warstwę logiki biznesowej i udostępnione składniki, takie jak uwierzytelnianie i walidacja. Warstwa danych zawiera relacyjną bazę danych. Aplikacje n-warstwowe zwykle przechowują poufne informacje w warstwie dostępu do danych warstwy środkowej, aby zachować izolację od użytkowników końcowych, którzy uzyskują dostęp do warstwy prezentacji. Aby uzyskać więcej informacji, zobacz N-warstwowe aplikacje danych — omówienie.
Jednym ze sposobów oddzielenia różnych warstw w aplikacji n-warstwowej jest utworzenie odrębnych projektów dla każdej warstwy, która ma zostać uwzględniona w aplikacji. Typizowane zestawy danych zawierają DataSet Project
właściwość, która określa, do których projektów powinien przejść wygenerowany zestaw danych i TableAdapter
kod.
W tym przewodniku pokazano, jak oddzielić zestaw danych i TableAdapter
kod w dyskretne projekty biblioteki klas przy użyciu Projektanta zestawów danych. Po rozdzieleniu zestawu danych i kodu TableAdapter należy utworzyć usługi Windows Communication Foundation Services i Usługi danych programu WCF w usłudze Visual Studio w celu wywołania warstwy dostępu do danych. Na koniec utworzysz aplikację Windows Forms jako warstwę prezentacji. Ta warstwa uzyskuje dostęp do danych z usługi danych.
W tym przewodniku wykonasz następujące kroki:
Utwórz nowe rozwiązanie n-warstwowe zawierające wiele projektów.
Dodaj dwa projekty biblioteki klas do rozwiązania n-warstwowego.
Utwórz typowany zestaw danych przy użyciu Kreatora konfiguracji źródła danych.
Rozdziel wygenerowane elementy TableAdapters i kod zestawu danych na odrębne projekty.
Utwórz usługę Windows Communication Foundation (WCF), aby wywołać warstwę dostępu do danych.
Tworzenie funkcji w usłudze w celu pobierania danych z warstwy dostępu do danych.
Utwórz aplikację Windows Forms, która będzie służyć jako warstwa prezentacji.
Utwórz kontrolki Windows Forms powiązane ze źródłem danych.
Napisz kod, aby wypełnić tabele danych.
Wymagania wstępne
Do ukończenia tego samouczka potrzebne są obciążenia tworzenia aplikacji klasycznych platformy .NET oraz przechowywania i przetwarzania danych zainstalowanych w programie Visual Studio. Aby je zainstalować, otwórz Instalator programu Visual Studio i wybierz pozycję Modyfikuj (lub Więcej>modyfikacji) obok wersji programu Visual Studio, którą chcesz zmodyfikować. Zobacz Modyfikowanie programu Visual Studio.
W tym przewodniku użyto bazy danych SQL Server Express LocalDB i przykładowej bazy danych Northwind.
Jeśli nie masz bazy danych SQL Server Express LocalDB, zainstaluj ją ze strony pobierania programu SQL Server Express lub za pośrednictwem Instalator programu Visual Studio. W Instalator programu Visual Studio można zainstalować bazę danych SQL Server Express LocalDB w ramach obciążenia tworzenia aplikacji klasycznych platformy .NET lub jako pojedynczy składnik.
Zainstaluj przykładową bazę danych Northwind, wykonując następujące kroki:
W programie Visual Studio otwórz okno Eksplorator obiektów programu SQL Server. (program SQL Server Eksplorator obiektów jest instalowany w ramach obciążenia Magazynu danych i przetwarzania w Instalator programu Visual Studio). Rozwiń węzeł PROGRAMU SQL Server. Kliknij prawym przyciskiem myszy wystąpienie bazy danych LocalDB i wybierz pozycję Nowe zapytanie.
Zostanie otwarte okno edytora zapytań.
Skopiuj skrypt Northwind Transact-SQL do schowka. Ten skrypt języka T-SQL tworzy bazę danych Northwind od podstaw i wypełnia ją danymi.
Wklej skrypt języka T-SQL do edytora zapytań, a następnie wybierz przycisk Wykonaj .
Po krótkim czasie zapytanie zakończy działanie i zostanie utworzona baza danych Northwind.
W programie Visual Studio otwórz okno Eksplorator obiektów programu SQL Server. (program SQL Server Eksplorator obiektów jest instalowany w ramach obciążenia Magazynu danych i przetwarzania w Instalator programu Visual Studio). Rozwiń węzeł PROGRAMU SQL Server. Kliknij prawym przyciskiem myszy wystąpienie bazy danych LocalDB i wybierz pozycję Nowe zapytanie.
Jeśli nie widzisz wystąpienia bazy danych LocalDB, użyj przycisku paska narzędzi Dodaj program SQL Server. Zostanie wyświetlone okno dialogowe. W oknie dialogowym rozwiń węzeł Lokalny i wybierz pozycję MSSQLLocalDB. Wprowadź odpowiednie poświadczenia. Możesz pozostawić wybór domyślny dla bazy danych.
Wybierz opcję Połącz. Węzeł jest dodawany dla bazy danych LocalDB w programie SQL Server Eksplorator obiektów.
Kliknij prawym przyciskiem myszy wystąpienie bazy danych LocalDB i wybierz pozycję Nowe zapytanie.
Zostanie otwarte okno edytora zapytań.
Skopiuj skrypt Northwind Transact-SQL do schowka. Ten skrypt języka T-SQL tworzy bazę danych Northwind od podstaw i wypełnia ją danymi.
Wklej skrypt języka T-SQL do edytora zapytań, a następnie wybierz przycisk Wykonaj .
Po krótkim czasie zapytanie zakończy działanie i zostanie utworzona baza danych Northwind.
Tworzenie n-warstwowego rozwiązania i biblioteki klas do przechowywania zestawu danych (DataEntityTier)
Pierwszym krokiem tego przewodnika jest utworzenie rozwiązania i dwóch projektów bibliotek klas. Biblioteka pierwszej klasy zawiera zestaw danych (wygenerowana klasa typowa DataSet
i tabele DataTable, które przechowują dane aplikacji). Ten projekt jest używany jako warstwa jednostki danych aplikacji i zwykle znajduje się w warstwie środkowej. Zestaw danych tworzy początkowy zestaw danych i automatycznie oddziela kod do dwóch bibliotek klas.
Uwaga
Przed kliknięciem przycisku OK pamiętaj, aby poprawnie nazwać projekt i rozwiązanie. Ułatwi to ukończenie tego przewodnika.
Aby utworzyć rozwiązanie n-warstwowe i bibliotekę klas DataEntityTier
W programie Visual Studio utwórz projekt przy użyciu szablonu projektu Windows Forms App (.NET Framework) dla języka C# lub Visual Basic. Platformy .NET Core, .NET 5 i nowsze nie są obsługiwane.
Nadaj projektowi nazwę DataEntityTier.
Nadaj rozwiązaniu nazwę NTierWalkthrough, a następnie wybierz przycisk OK.
Zostanie utworzone rozwiązanie NTierWalkthrough zawierające projekt DataEntityTier i dodane do Eksplorator rozwiązań.
Tworzenie biblioteki klas do przechowywania elementów TableAdapters (DataAccessTier)
Następnym krokiem po utworzeniu projektu DataEntityTier jest utworzenie innego projektu biblioteki klas. Ten projekt zawiera wygenerowane elementy TableAdapters i jest nazywany warstwą dostępu do danych aplikacji. Warstwa dostępu do danych zawiera informacje wymagane do nawiązania połączenia z bazą danych i zwykle znajdują się w warstwie środkowej.
Aby utworzyć oddzielną bibliotekę klas dla klasy TableAdapters
Kliknij prawym przyciskiem myszy rozwiązanie w Eksplorator rozwiązań i wybierz polecenie Dodaj>nowy projekt.
Wybierz szablon projektu Biblioteka klas (.NET Framework).
Nadaj projektowi nazwę DataAccessTier i wybierz przycisk OK.
Projekt DataAccessTier jest tworzony i dodawany do rozwiązania NTierWalkthrough.
Tworzenie zestawu danych
Następnym krokiem jest utworzenie typizowanego zestawu danych. Typizowane zestawy danych są tworzone z klasą zestawu danych (w tym DataTables
klasami) i TableAdapter
klasami w jednym projekcie. (Wszystkie klasy są generowane w jednym pliku). Po rozdzieleniu zestawu danych i elementu TableAdapters na różne projekty jest to klasa zestawu danych przeniesiona do innego projektu, pozostawiając TableAdapter
klasy w oryginalnym projekcie. W związku z tym utwórz zestaw danych w projekcie, który ostatecznie będzie zawierać elementy TableAdapters (projekt DataAccessTier). Zestaw danych można utworzyć przy użyciu Kreatora konfiguracji źródła danych.
Uwaga
Aby utworzyć połączenie, musisz mieć dostęp do przykładowej bazy danych Northwind. Aby uzyskać informacje o sposobie konfigurowania przykładowej bazy danych Northwind, zobacz How to: Install sample databases (Instrukcje: instalowanie przykładowych baz danych).
Aby utworzyć zestaw danych
Wybierz wartość DataAccessTier w Eksplorator rozwiązań.
W menu Dane wybierz pozycję Pokaż źródła danych.
Zostanie otwarte okno Źródła danych.
W oknie Źródła danych wybierz pozycję Dodaj nowe źródło danych, aby uruchomić Kreatora konfiguracji źródła danych.
Na stronie Wybierz typ źródła danych wybierz pozycję Baza danych , a następnie wybierz pozycję Dalej.
Na stronie Wybieranie połączenia danych wykonaj jedną z następujących akcji:
Jeśli na liście rozwijanej jest dostępne połączenie danych z przykładową bazą danych Northwind, wybierz je.
lub
Wybierz pozycję Nowe połączenie , aby otworzyć okno dialogowe Dodawanie połączenia .
Jeśli baza danych wymaga hasła, wybierz opcję dołączenia poufnych danych, a następnie wybierz przycisk Dalej.
Uwaga
Jeśli wybrano lokalny plik bazy danych (zamiast łączyć się z programem SQL Server), może zostać wyświetlony monit o dodanie pliku do projektu. Wybierz pozycję Tak , aby dodać plik bazy danych do projektu.
Wybierz pozycję Dalej na stronie Zapisz parametry połączenia na stronie Plik konfiguracji aplikacji.
Rozwiń węzeł Tabele na stronie Wybieranie obiektów bazy danych.
Zaznacz pola wyboru tabel Klienci i Zamówienia, a następnie wybierz pozycję Zakończ.
Element NorthwindDataSet jest dodawany do projektu DataAccessTier i jest wyświetlany w oknie Źródła danych.
Oddzielanie elementów TableAdapters od zestawu danych
Po utworzeniu zestawu danych oddziel wygenerowaną klasę zestawu danych od klasy TableAdapters. W tym celu należy ustawić właściwość DataSet Project na nazwę projektu, w którym ma być przechowywana oddzielona klasa zestawu danych.
Aby oddzielić elementy TableAdapters od zestawu danych
Kliknij dwukrotnie plik NorthwindDataSet.xsd w Eksplorator rozwiązań, aby otworzyć zestaw danych w Projektancie zestawów danych.
Wybierz pusty obszar w projektancie.
Znajdź węzeł Projekt Zestawu danych w oknie Właściwości.
Na liście Projekt zestawu danych wybierz pozycję DataEntityTier.
W menu Kompilacja wybierz pozycję Kompiluj rozwiązanie.
Zestaw danych i klasy TableAdapters są rozdzielone na dwa projekty biblioteki klas. Projekt, który pierwotnie zawierał cały zestaw danych (
DataAccessTier
) zawiera teraz tylko elementy TableAdapters. Projekt wyznaczony we właściwości Projekt Zestawu danych (DataEntityTier
) zawiera typowany zestaw danych: NorthwindDataSet.Dataset.Designer.vb (lub NorthwindDataSet.Dataset.Designer.cs).
Uwaga
W przypadku oddzielenia zestawów danych i elementów TableAdapters (przez ustawienie właściwości Projektu Zestawu danych) istniejące częściowe klasy zestawów danych w projekcie nie zostaną przeniesione automatycznie. Istniejące klasy częściowe zestawu danych muszą zostać ręcznie przeniesione do projektu zestawu danych.
Tworzenie nowej aplikacji usługi
W tym przewodniku pokazano, jak uzyskać dostęp do warstwy dostępu do danych przy użyciu usługi WCF, więc utwórzmy nową aplikację usługi WCF.
Aby utworzyć nową aplikację usługi WCF
Kliknij prawym przyciskiem myszy rozwiązanie w Eksplorator rozwiązań i wybierz polecenie Dodaj>nowy projekt.
W oknie dialogowym Nowy projekt w okienku po lewej stronie wybierz pozycję WCF. W środkowym okienku wybierz pozycję Biblioteka usług WCF.
Nadaj projektowi nazwę DataService i wybierz przycisk OK.
Projekt DataService jest tworzony i dodawany do rozwiązania NTierWalkthrough.
Tworzenie metod w warstwie dostępu do danych w celu zwrócenia klientów i danych zamówień
Usługa danych musi wywołać dwie metody w warstwie dostępu do danych: GetCustomers
i GetOrders
. Te metody zwracają tabele Northwind Customers
i Orders
. GetCustomers
Utwórz metody i GetOrders
w projekcieDataAccessTier
.
Aby utworzyć metodę w warstwie dostępu do danych, która zwraca tabelę Customers
W Eksplorator rozwiązań kliknij dwukrotnie pozycję NorthwindDataset.xsd, aby otworzyć zestaw danych.
Kliknij prawym przyciskiem myszy pozycję CustomersTableAdapter i kliknij polecenie Dodaj zapytanie.
Na stronie Wybieranie typu polecenia pozostaw domyślną wartość Użyj instrukcji SQL i kliknij przycisk Dalej.
Na stronie Wybieranie typu zapytania pozostaw wartość domyślną SELECT, która zwraca wiersze , a następnie kliknij przycisk Dalej.
Na stronie Określanie instrukcji SQL SELECT pozostaw domyślne zapytanie i kliknij przycisk Dalej.
Na stronie Wybieranie metod do wygenerowania wpisz GetCustomers jako nazwę metody w sekcji Return a DataTable (Zwracanie tabeli danych).
Kliknij przycisk Zakończ.
Aby utworzyć metodę w warstwie dostępu do danych, która zwraca tabelę Orders
Kliknij prawym przyciskiem myszy pozycję OrdersTableAdapter i kliknij polecenie Dodaj zapytanie.
Na stronie Wybieranie typu polecenia pozostaw domyślną wartość Użyj instrukcji SQL i kliknij przycisk Dalej.
Na stronie Wybieranie typu zapytania pozostaw wartość domyślną SELECT, która zwraca wiersze , a następnie kliknij przycisk Dalej.
Na stronie Określanie instrukcji SQL SELECT pozostaw domyślne zapytanie i kliknij przycisk Dalej.
Na stronie Wybieranie metod do wygenerowania wpisz GetOrders jako nazwę metody w sekcji Return a DataTable (Zwracanie tabeli danych).
Kliknij przycisk Zakończ.
W menu Kompilacja kliknij pozycję Kompiluj rozwiązanie.
Dodawanie odwołania do jednostki danych i warstw dostępu do danych do usługi danych
Ponieważ usługa danych wymaga informacji z zestawu danych i elementów TableAdapters, dodaj odwołania do projektów DataEntityTier i DataAccessTier .
Aby dodać odwołania do usługi danych
Kliknij prawym przyciskiem myszy pozycję DataService w Eksplorator rozwiązań i kliknij pozycję Dodaj odwołanie.
Kliknij kartę Projekty w oknie dialogowym Dodawanie odwołania .
Wybierz projekty DataAccessTier i DataEntityTier .
Kliknij przycisk OK.
Dodawanie funkcji do usługi w celu wywoływania metod GetCustomers i GetOrders w warstwie dostępu do danych
Teraz, gdy warstwa dostępu do danych zawiera metody zwracania danych, utwórz metody w usłudze danych w celu wywołania metod w warstwie dostępu do danych.
Uwaga
W przypadku projektów języka C# należy dodać odwołanie do System.Data.DataSetExtensions
zestawu, aby skompilować poniższy kod.
Aby utworzyć funkcje GetCustomers i GetOrders w usłudze danych
W projekcie DataService kliknij dwukrotnie IService1.vb lub IService1.cs.
Dodaj następujący kod w obszarze Dodaj operacje usługi tutaj komentarz:
[OperationContract] DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers(); [OperationContract] DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
Uwaga
Kod tego samouczka jest dostępny w językach C# i Visual Basic. Aby przełączyć język kodu na tej stronie między językami C# i Visual Basic, użyj przełącznika języka kodu w górnej części strony po prawej stronie.
W projekcie DataService kliknij dwukrotnie Service1.vb (lub Service1.cs).
Dodaj następujący kod do klasy Service1 :
public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers() { DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter CustomersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter(); return CustomersTableAdapter1.GetCustomers(); } public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders() { DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter OrdersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter(); return OrdersTableAdapter1.GetOrders(); }
W menu Kompilacja kliknij pozycję Kompiluj rozwiązanie.
Tworzenie warstwy prezentacji do wyświetlania danych z usługi danych
Teraz, gdy rozwiązanie zawiera usługę danych zawierającą metody, które powodują wywołanie warstwy dostępu do danych, utwórz kolejny projekt, który wywołuje usługę danych i przedstawi dane użytkownikom. W tym przewodniku utwórz aplikację Windows Forms; jest to warstwa prezentacji aplikacji n-warstwowej.
Aby utworzyć projekt warstwy prezentacji
Kliknij prawym przyciskiem myszy rozwiązanie w Eksplorator rozwiązań i wybierz polecenie Dodaj>nowy projekt.
W oknie dialogowym Nowy projekt w okienku po lewej stronie wybierz pozycję Pulpit systemu Windows. W środkowym okienku wybierz pozycję Aplikacja formularzy systemu Windows.
Nadaj projektowi nazwę PresentationTier i kliknij przycisk OK.
Projekt PresentationTier jest tworzony i dodawany do rozwiązania NTierWalkthrough.
Ustawianie projektu PresentationTier jako projektu startowego
Ustawimy projekt PresentationTier jako projekt startowy dla rozwiązania, ponieważ jest to rzeczywista aplikacja kliencka, która przedstawia dane i wchodzi w interakcje z nimi.
Aby ustawić nowy projekt warstwy prezentacji jako projekt startowy
- W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję PresentationTier i kliknij polecenie Ustaw jako projekt startowy.
Dodawanie odwołań do warstwy prezentacji
Aplikacja kliencka PresentationTier wymaga odwołania do usługi danych w celu uzyskania dostępu do metod w usłudze. Ponadto wymagane jest odwołanie do zestawu danych w celu włączenia udostępniania typów przez usługę WCF. Dopóki nie włączysz udostępniania typów za pośrednictwem usługi danych, kod dodany do częściowej klasy zestawu danych nie będzie dostępny dla warstwy prezentacji. Ponieważ zazwyczaj dodajesz kod, taki jak kod weryfikacyjny do wiersza i kolumny zmieniające zdarzenia tabeli danych, prawdopodobnie chcesz uzyskać dostęp do tego kodu od klienta.
Aby dodać odwołanie do warstwy prezentacji
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję PresentationTier i wybierz polecenie Dodaj odwołanie.
W oknie dialogowym Dodawanie odwołania wybierz kartę Projekty.
Wybierz pozycję DataEntityTier i wybierz przycisk OK.
Aby dodać odwołanie do usługi do warstwy prezentacji
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję PresentationTier i wybierz pozycję Dodaj odwołanie do usługi.
W oknie dialogowym Dodawanie odwołania do usługi wybierz pozycję Odnajdź.
Wybierz pozycję Service1 i wybierz przycisk OK.
Uwaga
Jeśli masz wiele usług na bieżącym komputerze, wybierz usługę utworzoną wcześniej w tym przewodniku (usługę zawierającą
GetCustomers
metody iGetOrders
).
Dodawanie elementu DataGridViews do formularza w celu wyświetlenia danych zwracanych przez usługę danych
Po dodaniu odwołania do usługi danych okno Źródła danych zostanie automatycznie wypełnione danymi zwracanymi przez usługę.
Aby dodać dwa powiązane dane DataGridViews do formularza
W Eksplorator rozwiązań wybierz projekt PresentationTier.
W oknie Źródła danych rozwiń węzeł NorthwindDataSet i znajdź węzeł Klienci.
Przeciągnij węzeł Klienci na form1.
W oknie Źródła danych rozwiń węzeł Klienci i znajdź powiązany węzeł Zamówienia (węzeł Zamówienia zagnieżdżony w węźle Klienci).
Przeciągnij powiązany węzeł Orders (Zamówienia) na form1.
Utwórz procedurę obsługi zdarzeń
Form1_Load
, klikając dwukrotnie pusty obszar formularza.Dodaj następujący kod do programu obsługi zdarzeń
Form1_Load
.
Zwiększ maksymalny rozmiar komunikatu dozwolony przez usługę
Wartość domyślna parametru maxReceivedMessageSize
nie jest wystarczająco duża, aby przechowywać dane pobrane z Customers
tabel i Orders
. W poniższych krokach zwiększysz wartość do 6553600. Zmieniasz wartość na kliencie, która automatycznie aktualizuje odwołanie do usługi.
Uwaga
Niższy rozmiar domyślny ma na celu ograniczenie narażenia na ataki typu "odmowa usługi" (DoS). Aby uzyskać więcej informacji, zobacz MaxReceivedMessageSize.
Aby zwiększyć wartość maxReceivedMessageSize
W Eksplorator rozwiązań kliknij dwukrotnie plik app.config w projekcie PresentationTier.
Znajdź atrybut maxReceivedMessageSize i zmień wartość na
6553600
. Jeśli nie widziszbasicHttpBinding
wpisu, dodaj go tak jak w poniższym przykładzie:<system.serviceModel> <bindings> <basicHttpBinding> <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" /> </basicHttpBinding> </bindings> </system.serviceModel>
Testowanie aplikacji
Uruchom aplikację, naciskając F5. Dane z tabel i Orders
są pobierane z Customers
usługi danych i wyświetlane w formularzu.
Następne kroki
W zależności od wymagań aplikacji istnieje kilka kroków, które można wykonać po zapisaniu powiązanych danych w aplikacji opartej na systemie Windows. Można na przykład wprowadzić następujące ulepszenia w tej aplikacji:
Dodaj walidację do zestawu danych.
Dodaj do usługi dodatkowe metody aktualizowania danych z powrotem do bazy danych.