Пошаговое руководство. Создание приложения данных n-уровня с ADO.NET и платформа .NET Framework

Примечание.

Наборы данных и связанные классы являются устаревшими технологиями платформа .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти во время отключения приложений от базы данных. Они особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных оказались очень успешными, мы рекомендуем новым приложениям .NET использовать Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей, и он имеет более простой интерфейс программирования.

N-уровневые приложения для обработки данных — это приложения, которые осуществляют доступ к данным и разделены на несколько логических слоев или уровней. Разделение компонентов приложения на несколько отдельных уровней повышает удобство обслуживания и масштабируемость приложения. Это обеспечивается за счет упрощения внедрения новых технологий, которые можно применить к отдельному уровню без пересмотра всего решения. N-уровневая архитектура включает в себя уровень представления, средний уровень и уровень данных. Средний уровень обычно содержит слой доступа к данным, слой бизнес-логики и общие компоненты, такие как аутентификация и проверка. Уровень данных содержит реляционную базу данных. N-уровневые приложения обычно хранят конфиденциальную информацию на слое доступа к данным среднего уровня, чтобы обеспечить изоляцию от конечных пользователей, работающих с уровнем представления. Дополнительные сведения см. в обзоре приложений данных уровня N.

Один из способов разделения разных уровней в n-уровневом приложении заключается в создании отдельных проектов для каждого уровня, который требуется включить в приложение. Типизированные наборы данных содержат свойство DataSet Project, определяющее, в какие проекты следует передать созданный набор данных и код TableAdapter.

В данном пошаговом руководстве демонстрируется, как разделить набор данных и код TableAdapter по отдельным проектам библиотеки классов с помощью конструктора наборов данных. После разделения набора данных и кода TableAdapter создайте службы Windows Communication Foundation и службы данных WCF в службе Visual Studio для вызова уровня доступа к данным. Наконец, вы создадите приложение Windows Forms в качестве уровня презентации. Этот уровень осуществляет доступ к данным из службы данных.

В этом пошаговом руководстве вы выполните следующие действия.

  • Создайте новое n-уровневое решение, содержащее несколько проектов.

  • Добавление в n-уровневое решение двух проектов библиотеки классов.

  • Создание типизированного набора данных с помощью мастера настройки источника данных.

  • Разделите созданный код TableAdapters и набора данных на дискретные проекты.

  • Создание службы WCF для вызова уровня доступа к данным.

  • Создание функций в службе для извлечения данных из уровня доступа к данным.

  • Создание приложения Windows Forms для использования в качестве уровня представления.

  • Создание элементов управления Windows Forms с привязкой к источнику данных.

  • Написание кода для заполнения таблиц данных.

Необходимые компоненты

Чтобы завершить работу с этим руководством, вам потребуется разработка классических приложений .NET и рабочие нагрузки хранения и обработки данных, установленные в Visual Studio. Чтобы установить их, откройте Visual Studio Installer и нажмите кнопку "Изменить" (или "Изменить>") рядом с версией Visual Studio, которую вы хотите изменить. См. раздел Изменение Visual Studio.

В этом пошаговом руководстве используется SQL Server Express LocalDB и пример базы данных Northwind.

  1. Если у вас нет SQL Server Express LocalDB, установите его на странице скачивания SQL Server Express или с помощью Установщика Visual Studio. В установщике Visual Studio можно установить SQL Server Express LocalDB в рамках рабочей нагрузки разработки классических приложений .NET или как отдельный компонент.

  2. Установите пример базы данных Northwind, выполнив следующие действия.

    1. В Visual Studio откройте окно обозреватель объектов SQL Server. (SQL Server обозреватель объектов устанавливается как часть рабочей нагрузки хранилища данных и обработки в Visual Studio Installer.) Разверните узел SQL Server. Щелкните правой кнопкой мыши экземпляр LocalDB и выберите новый запрос.

      Откроется окно редактора запросов.

    2. Скопируйте скрипт Northwind Transact-SQL в буфер обмена. Этот скрипт T-SQL создает базу данных Northwind с нуля и заполняет ее данными.

    3. Вставьте скрипт T-SQL в редактор запросов и нажмите кнопку "Выполнить ".

      Через некоторое время запрос завершает работу и создается база данных Northwind.

    1. В Visual Studio откройте окно обозреватель объектов SQL Server. (SQL Server обозреватель объектов устанавливается как часть рабочей нагрузки хранилища данных и обработки в Visual Studio Installer.) Разверните узел SQL Server. Щелкните правой кнопкой мыши экземпляр LocalDB и выберите новый запрос.

      Если экземпляр LocalDB не отображается, нажмите кнопку "Добавить SQL Server". Откроется диалоговое окно. В диалоговом окне разверните узел Local и выберите MSSQLLocalDB. Введите соответствующие учетные данные. Вы можете оставить выбор по умолчанию для базы данных.

      Снимок экрана: диалоговое окно Подключение База данных SQL

    2. Выберите Подключиться. Узел добавляется для LocalDB в SQL Server обозреватель объектов.

    3. Щелкните правой кнопкой мыши экземпляр LocalDB и выберите новый запрос.

      Откроется окно редактора запросов.

    4. Скопируйте скрипт Northwind Transact-SQL в буфер обмена. Этот скрипт T-SQL создает базу данных Northwind с нуля и заполняет ее данными.

    5. Вставьте скрипт T-SQL в редактор запросов и нажмите кнопку "Выполнить ".

      Через некоторое время запрос завершает работу и создается база данных Northwind.

Создайте n-уровень решения и библиотеку классов для хранения набора данных (DataEntityTier)

Первым шагом данного руководства является создание решения и двух проектов библиотеки классов. Первая библиотека классов содержит набор данных (созданный типизированный DataSet класс и DataTables, в котором хранятся данные приложения). Этот проект используется в качестве слоя сущностей данных приложения и обычно находится в среднем уровне. Набор данных создает исходный набор данных и автоматически разделяет код на две библиотеки классов.

Примечание.

Обязательно присвойте проекту и решению правильные имена перед нажатием кнопки ОК. Это облегчит выполнение данного пошагового руководства.

Создание n-уровневого решения и библиотеки классов DataEntityTier

  1. В Visual Studio создайте проект с помощью шаблона проекта приложения Windows Forms (платформа .NET Framework) для C# или Visual Basic. .NET Core, .NET 5 и более поздних версий не поддерживаются.

  2. Присвойте проекту имя DataEntityTier.

  3. Назовите решение NTierWalkthrough и нажмите кнопку "ОК".

    Создается решение NTierWalkthrough, содержащее проект DataEntityTier, которое добавляется в Обозреватель решений.

Создайте библиотеку классов для хранения TableAdapters (DataAccessTier)

Следующий наг после создания проекта DataEntityTier заключается в создании другого проекта библиотеки классов. Этот проект содержит созданные TableAdapters и называется уровнем доступа к данным приложения. Уровень доступа к данным содержит информацию, необходимую для подключения к базе данных, и обычно находится на среднем уровне.

Создание отдельной библиотеки классов для TableAdapters

  1. В обозревателе решений щелкните решение правой кнопкой мыши и выберите Добавить>Создать проект.

  2. Выберите шаблон проекта библиотеки классов (платформа .NET Framework).

  3. Назовите проект DataAccessTier и нажмите кнопку "ОК".

    Создается проект DataAccessTier, который добавляется в решение NTierWalkthrough.

Создание набора данных

Следующим шагом является создание типизированного набора данных. Типизированные наборы данных создаются как с классом набора данных (включая классы), так DataTables и TableAdapter классами в одном проекте. (Все классы создаются в одном файле.) Если разделить набор данных и TableAdapters на разные проекты, это класс набора данных, который перемещается в другой проект, оставляя TableAdapter классы в исходном проекте. Поэтому создайте набор данных в проекте, который в конечном счете будет содержать TableAdapters (проект DataAccessTier). Вы создаете набор данных с помощью мастера настройки источника данных.

Примечание.

Для создания подключения необходимо иметь доступ к учебной базе данных "Борей". Сведения о настройке образца базы данных Northwind см. в разделе "Практическое руководство. Установка примеров баз данных".

Создание набора данных

  1. Выберите DataAccessTier в Обозреватель решений.

  2. В меню Данные выберите пункт Показать источники данных.

    Открывается окно Источники данных.

  3. В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.

  4. На странице "Выбор типа источника данных" выберите "База данных" и нажмите кнопку "Далее".

  5. На странице Выбор подключения к базе данных выполните одно из следующих действий:

    Если подключение к образцу базы данных Northwind доступно в раскрывающемся списке, выберите его.

    or

    Нажмите кнопку "Создать Подключение", чтобы открыть диалоговое окно "Добавить Подключение ion".

  6. Если для базы данных требуется пароль, выберите параметр для включения конфиденциальных данных и нажмите кнопку "Далее".

    Примечание.

    Если вы выбрали файл локальной базы данных (вместо подключения к SQL Server), может отображаться запрос о том, требуется ли включить этот файл в проект. Нажмите кнопку "Да", чтобы добавить файл базы данных в проект.

  7. Нажмите кнопку "Далее" на странице "Сохранить строку Подключение ion" на страницу "Файл конфигурации приложения".

  8. Разверните узел Таблицы на странице Выбор объектов базы данных .

  9. Выберите проверка boxes для таблиц "Клиенты и заказы" и нажмите кнопку "Готово".

    NorthwindDataSet добавляется в проект DataAccessTier и отображается в окне Источники данных.

Разделите tableAdapters из набора данных

После создания набора данных отделите сформированный класс набора данных от адаптеров таблицы. Для этого задайте для свойства Проект DataSet имя проекта, в котором требуется хранить отделенный класс набора данных.

Порядок отделения адаптеров таблиц от набора данных

  1. Дважды щелкните NorthwindDataSet.xsd в обозревателе решений, чтобы открыть набор данных в конструкторе наборов данных.

  2. Выберите пустую область в конструкторе.

  3. Найдите узел Проект DataSet в окне Свойства.

  4. В списке проектов Набора данных выберите DataEntityTier.

  5. В меню Сборка выберите команду Собрать решение.

    Набор данных и адаптеры таблицы делятся на два проекта библиотеки классов. Проект, который первоначально содержал весь набор данных (DataAccessTier) теперь содержит только tableAdapters. Проект, назначенный в свойстве Project DataSet (DataEntityTier) содержит типизированный набор данных: NorthwindDataSet.Dataset.Designer.vb (или NorthwindDataSet.Dataset.Designer.cs).

Примечание.

При разделении наборов данных и адаптеров таблиц (посредством установки свойства Проект DataSet) существующие разделяемые классы наборов данных в проекте не перемещаются автоматически. Их необходимо переместить в проект набора данных вручную.

Создание нового приложения службы

В этом пошаговом руководстве показано, как получить доступ к уровню доступа к данным с помощью службы WCF, поэтому давайте создадим новое приложение службы WCF.

Создание нового приложения службы WCF

  1. В обозревателе решений щелкните решение правой кнопкой мыши и выберите Добавить>Создать проект.

  2. В диалоговом окне "Новый проект" в левой области выберите WCF. В средней области выберите библиотеку служб WCF.

  3. Назовите проект DataService и нажмите кнопку "ОК".

    Создается проект DataService, который добавляется в решение NTierWalkthrough.

Создание методов на уровне доступа к данным для возврата данных клиентов и заказов

Служба данных должна вызывать два метода на уровне доступа к данным: GetCustomers и GetOrders. Эти методы возвращают northwind Customers и Orders таблицы. GetCustomers Создайте в DataAccessTier проекте методы и GetOrders методы.

Создание метода на уровне доступа к данным, возвращающего таблицу клиентов

  1. В Обозреватель решений дважды щелкните NorthwindDataset.xsd, чтобы открыть набор данных.

  2. Щелкните правой кнопкой мыши CustomersTableAdapter и нажмите кнопку "Добавить запрос".

  3. На странице Выбор типа команды оставьте значение по умолчанию для параметра Использовать инструкции SQL и нажмите кнопку Далее.

  4. На странице Выбор типа запроса оставьте значение по умолчанию для параметра Инструкция SELECT, возвращающая строки и нажмите кнопку Далее.

  5. На странице Укажите SQL-инструкцию SELECT оставьте запрос по умолчанию и нажмите кнопку Далее.

  6. На странице Выбор методов для автоматического создания введите GetCustomers для параметра Имя метода в разделе Вернуть таблицу данных (DataTable).

  7. Нажмите кнопку Готово.

Создание метода на уровне доступа к данным, возвращающего таблицу заказов

  1. Щелкните правой кнопкой мыши элемент OrdersTableAdapter и выберите пункт Добавить запрос.

  2. На странице Выбор типа команды оставьте значение по умолчанию для параметра Использовать инструкции SQL и нажмите кнопку Далее.

  3. На странице Выбор типа запроса оставьте значение по умолчанию для параметра Инструкция SELECT, возвращающая строки и нажмите кнопку Далее.

  4. На странице Укажите SQL-инструкцию SELECT оставьте запрос по умолчанию и нажмите кнопку Далее.

  5. На странице Выбор методов для автоматического создания введите GetOrders для параметра Имя метода в разделе Вернуть таблицу данных (DataTable).

  6. Нажмите кнопку Готово.

  7. В меню Сборка выберите Построить решение.

Добавление ссылки на сущность данных и уровни доступа к данным в службу данных

Так как службе данных нужна информация из набора данных и адаптеров таблицы, добавьте ссылки на проекты DataEntityTier и DataAccessTier.

Добавление ссылок в службу данных

  1. Щелкните правой кнопкой мыши DataService в обозревателе решений и выберите команду Добавить ссылку.

  2. Откройте вкладку Проекты в диалоговом окне Добавление ссылки.

  3. Выберите проекты DataAccessTier и DataEntityTier.

  4. Щелкните OK.

Добавление функций в службу для вызова методов GetCustomers и GetOrders на уровне доступа к данным

Теперь, когда уровень доступа к данным содержит методы для возврата данных, создайте в службе данных методы для вызова методов на уровне доступа к данным.

Примечание.

Для проектов C# необходимо добавить ссылку на сборку System.Data.DataSetExtensions, чтобы следующий код прошел компиляцию.

Создание функций GetCustomers и GetOrders в службе данных

  1. В проекте DataService дважды щелкните IService1.vb или IService1.cs.

  2. Добавьте следующий код под комментарием Добавьте здесь операции служб:

    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    

    Примечание.

    Код для этого руководства доступен в C# и Visual Basic. Чтобы переключить язык кода на этой странице между C# и Visual Basic, используйте переключатель языка кода в верхней части страницы справа.

  3. В проекте DataService дважды щелкните Service1.vb (или Service1.cs).

  4. Добавьте следующий код в класс 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();
    }
    
  5. В меню Сборка выберите Построить решение.

Создание уровня презентации для отображения данных из службы данных

Теперь, когда решение содержит службу данных, которая имеет методы, которые вызывают уровень доступа к данным, создайте другой проект, который вызывает службу данных и предоставляет данные пользователям. В рамках данного руководства создайте приложение Windows Forms — это уровень представления n-уровневого приложения.

Создание проекта уровня представления

  1. В обозревателе решений щелкните решение правой кнопкой мыши и выберите Добавить>Создать проект.

  2. В диалоговом окне "Новый проект" в левой области выберите "Рабочий стол Windows". В средней области выберите приложение Windows Forms.

  3. Присвойте проекту имя PresentationTier и нажмите кнопку ОК.

    Создается проект PresentationTier, который добавляется в решение NTierWalkthrough.

Установка проекта PresentationTier в качестве запускаемого проекта

Мы задали проект PresentationTier для запуска решения, так как это фактическое клиентское приложение, которое представляет и взаимодействует с данными.

Порядок настройки нового проекта уровня представления в качестве запускаемого

  • В обозревателе решений щелкните правой кнопкой мыши PresentationTier и выберите команду Назначить запускаемым проектом.

Добавление ссылок на уровень презентации

Клиентскому приложению PresentationTier требуется ссылка на службу в службе данных для получения доступа к методам в этой службе. Кроме того, требуется ссылка на набор данных для обеспечения совместного использования типов службой WCF. Пока вы не включите общий доступ к типам через службу данных, код, добавленный в класс частичного набора данных, недоступен для уровня презентации. Так как обычно вы добавляете код, например код проверки в строку и столбец, изменяющие события таблицы данных, скорее всего, вы хотите получить доступ к этому коду от клиента.

Добавление ссылки на уровень представления

  1. В Обозреватель решений щелкните правой кнопкой мыши PresentationTier и выберите "Добавить ссылку".

  2. В диалоговом окне "Добавить ссылку" выберите вкладку "Проекты".

  3. Выберите DataEntityTier и нажмите кнопку "ОК".

Добавление ссылки на службу на уровень представления

  1. В Обозреватель решений щелкните правой кнопкой мыши PresentationTier и выберите "Добавить ссылку на службу".

  2. В диалоговом окне "Добавить ссылку на службу" нажмите кнопку "Обнаружение".

  3. Выберите "Служба1 " и нажмите кнопку "ОК".

    Примечание.

    Если на текущем компьютере несколько служб, выберите службу, созданную ранее в этом пошаговом руководстве (служба, содержащая GetCustomers методы и GetOrders методы).

Добавление DataGridViews в форму для отображения данных, возвращаемых службой данных

После добавления ссылки на службу в службу данных окно Источники данных автоматически заполняется возвращенными службой данными.

Создание двух элементов DataGridView с привязкой к данным на форме

  1. Выберите проект PresentationTier в обозревателе решений.

  2. В окне Источники данных разверните NorthwindDataSet и найдите узел Customers.

  3. Перетащите узел Customers на форму Form1.

  4. В окне Источники данных разверните узел Customers и найдите связанный узел Orders (узел Orders вложен в узел Customers).

  5. Перетащите связанный узел Orders на форму Form1.

  6. Создайте обработчик событий Form1_Load, дважды щелкнув пустую область на форме.

  7. Добавьте следующий код в обработчик событий Form1_Load.

    ServiceReference1.Service1Client DataSvc =
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

Увеличение максимального размера сообщения, разрешенного службой

Значение по умолчанию недостаточно большое, maxReceivedMessageSize чтобы хранить данные, полученные из Customers таблиц и Orders таблиц. В следующих шагах вы увеличите значение до 6553600. Вы изменяете значение на клиенте, которое автоматически обновляет ссылку на службу.

Примечание.

Меньший размер по умолчанию призван ограничить уязвимость для атак типа "отказ в обслуживании" (DoS). Дополнительные сведения см. в разделе MaxReceivedMessageSize.

Увеличение значения maxReceivedMessageSize

  1. В обозревателе решений дважды щелкните файл app.config в проекте PresentationTier.

  2. Найдите атрибут maxReceivedMessageSize и измените значение 6553600на . Если запись не отображается basicHttpBinding , добавьте следующий пример:

    <system.serviceModel>
     <bindings>
         <basicHttpBinding>
             <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" />
         </basicHttpBinding>
     </bindings>
    </system.serviceModel>
    

Тестирование приложения

Запустите приложение, нажав клавишу F5. Данные из таблиц извлекаются из CustomersOrders службы данных и отображаются в форме.

Следующие шаги

В зависимости от требований приложения может потребоваться выполнить несколько шагов после сохранения связанных данных в приложении под управлением Windows. Ниже приводится перечень рекомендаций, позволяющих улучшить данное приложение.

  • Добавьте проверку в набор данных.

  • Добавьте в службу дополнительные методы для обновления данных в базе данных.