Пошаговое руководство. Создание приложения данных 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.
Если у вас нет SQL Server Express LocalDB, установите его на странице скачивания SQL Server Express или с помощью Установщика Visual Studio. В установщике Visual Studio можно установить SQL Server Express LocalDB в рамках рабочей нагрузки разработки классических приложений .NET или как отдельный компонент.
Установите пример базы данных Northwind, выполнив следующие действия.
В Visual Studio откройте окно обозреватель объектов SQL Server. (SQL Server обозреватель объектов устанавливается как часть рабочей нагрузки хранилища данных и обработки в Visual Studio Installer.) Разверните узел SQL Server. Щелкните правой кнопкой мыши экземпляр LocalDB и выберите новый запрос.
Откроется окно редактора запросов.
Скопируйте скрипт Northwind Transact-SQL в буфер обмена. Этот скрипт T-SQL создает базу данных Northwind с нуля и заполняет ее данными.
Вставьте скрипт T-SQL в редактор запросов и нажмите кнопку "Выполнить ".
Через некоторое время запрос завершает работу и создается база данных Northwind.
В Visual Studio откройте окно обозреватель объектов SQL Server. (SQL Server обозреватель объектов устанавливается как часть рабочей нагрузки хранилища данных и обработки в Visual Studio Installer.) Разверните узел SQL Server. Щелкните правой кнопкой мыши экземпляр LocalDB и выберите новый запрос.
Если экземпляр LocalDB не отображается, нажмите кнопку "Добавить SQL Server". Откроется диалоговое окно. В диалоговом окне разверните узел Local и выберите MSSQLLocalDB. Введите соответствующие учетные данные. Вы можете оставить выбор по умолчанию для базы данных.
Выберите Подключиться. Узел добавляется для LocalDB в SQL Server обозреватель объектов.
Щелкните правой кнопкой мыши экземпляр LocalDB и выберите новый запрос.
Откроется окно редактора запросов.
Скопируйте скрипт Northwind Transact-SQL в буфер обмена. Этот скрипт T-SQL создает базу данных Northwind с нуля и заполняет ее данными.
Вставьте скрипт T-SQL в редактор запросов и нажмите кнопку "Выполнить ".
Через некоторое время запрос завершает работу и создается база данных Northwind.
Создайте n-уровень решения и библиотеку классов для хранения набора данных (DataEntityTier)
Первым шагом данного руководства является создание решения и двух проектов библиотеки классов. Первая библиотека классов содержит набор данных (созданный типизированный DataSet
класс и DataTables, в котором хранятся данные приложения). Этот проект используется в качестве слоя сущностей данных приложения и обычно находится в среднем уровне. Набор данных создает исходный набор данных и автоматически разделяет код на две библиотеки классов.
Примечание.
Обязательно присвойте проекту и решению правильные имена перед нажатием кнопки ОК. Это облегчит выполнение данного пошагового руководства.
Создание n-уровневого решения и библиотеки классов DataEntityTier
В Visual Studio создайте проект с помощью шаблона проекта приложения Windows Forms (платформа .NET Framework) для C# или Visual Basic. .NET Core, .NET 5 и более поздних версий не поддерживаются.
Присвойте проекту имя DataEntityTier.
Назовите решение NTierWalkthrough и нажмите кнопку "ОК".
Создается решение NTierWalkthrough, содержащее проект DataEntityTier, которое добавляется в Обозреватель решений.
Создайте библиотеку классов для хранения TableAdapters (DataAccessTier)
Следующий наг после создания проекта DataEntityTier заключается в создании другого проекта библиотеки классов. Этот проект содержит созданные TableAdapters и называется уровнем доступа к данным приложения. Уровень доступа к данным содержит информацию, необходимую для подключения к базе данных, и обычно находится на среднем уровне.
Создание отдельной библиотеки классов для TableAdapters
В обозревателе решений щелкните решение правой кнопкой мыши и выберите Добавить>Создать проект.
Выберите шаблон проекта библиотеки классов (платформа .NET Framework).
Назовите проект DataAccessTier и нажмите кнопку "ОК".
Создается проект DataAccessTier, который добавляется в решение NTierWalkthrough.
Создание набора данных
Следующим шагом является создание типизированного набора данных. Типизированные наборы данных создаются как с классом набора данных (включая классы), так DataTables
и TableAdapter
классами в одном проекте. (Все классы создаются в одном файле.) Если разделить набор данных и TableAdapters на разные проекты, это класс набора данных, который перемещается в другой проект, оставляя TableAdapter
классы в исходном проекте. Поэтому создайте набор данных в проекте, который в конечном счете будет содержать TableAdapters (проект DataAccessTier). Вы создаете набор данных с помощью мастера настройки источника данных.
Примечание.
Для создания подключения необходимо иметь доступ к учебной базе данных "Борей". Сведения о настройке образца базы данных Northwind см. в разделе "Практическое руководство. Установка примеров баз данных".
Создание набора данных
Выберите DataAccessTier в Обозреватель решений.
В меню Данные выберите пункт Показать источники данных.
Открывается окно Источники данных.
В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.
На странице "Выбор типа источника данных" выберите "База данных" и нажмите кнопку "Далее".
На странице Выбор подключения к базе данных выполните одно из следующих действий:
Если подключение к образцу базы данных Northwind доступно в раскрывающемся списке, выберите его.
or
Выберите "Создать подключение", чтобы открыть диалоговое окно "Добавить подключение".
Если для базы данных требуется пароль, выберите параметр для включения конфиденциальных данных и нажмите кнопку "Далее".
Примечание.
Если вы выбрали файл локальной базы данных (вместо подключения к SQL Server), может отображаться запрос о том, требуется ли включить этот файл в проект. Нажмите кнопку "Да", чтобы добавить файл базы данных в проект.
Нажмите кнопку "Далее " на странице "Сохранить строку подключения" на странице "Файл конфигурации приложения".
Разверните узел Таблицы на странице Выбор объектов базы данных .
Установите флажки для таблиц "Клиенты и заказы " и нажмите кнопку "Готово".
NorthwindDataSet добавляется в проект DataAccessTier и отображается в окне Источники данных.
Разделите tableAdapters из набора данных
После создания набора данных отделите сформированный класс набора данных от адаптеров таблицы. Для этого задайте для свойства Проект DataSet имя проекта, в котором требуется хранить отделенный класс набора данных.
Порядок отделения адаптеров таблиц от набора данных
Дважды щелкните NorthwindDataSet.xsd в обозревателе решений, чтобы открыть набор данных в конструкторе наборов данных.
Выберите пустую область в конструкторе.
Найдите узел Проект DataSet в окне Свойства.
В списке проектов Набора данных выберите DataEntityTier.
В меню Сборка выберите команду Собрать решение.
Набор данных и адаптеры таблицы делятся на два проекта библиотеки классов. Проект, который первоначально содержал весь набор данных (
DataAccessTier
) теперь содержит только tableAdapters. Проект, назначенный в свойстве Project DataSet (DataEntityTier
) содержит типизированный набор данных: NorthwindDataSet.Dataset.Designer.vb (или NorthwindDataSet.Dataset.Designer.cs).
Примечание.
При разделении наборов данных и адаптеров таблиц (посредством установки свойства Проект DataSet) существующие разделяемые классы наборов данных в проекте не перемещаются автоматически. Их необходимо переместить в проект набора данных вручную.
Создание нового приложения службы
В этом пошаговом руководстве показано, как получить доступ к уровню доступа к данным с помощью службы WCF, поэтому давайте создадим новое приложение службы WCF.
Создание нового приложения службы WCF
В обозревателе решений щелкните решение правой кнопкой мыши и выберите Добавить>Создать проект.
В диалоговом окне "Новый проект" в левой области выберите WCF. В средней области выберите библиотеку служб WCF.
Назовите проект DataService и нажмите кнопку "ОК".
Создается проект DataService, который добавляется в решение NTierWalkthrough.
Создание методов на уровне доступа к данным для возврата данных клиентов и заказов
Служба данных должна вызывать два метода на уровне доступа к данным: GetCustomers
и GetOrders
. Эти методы возвращают northwind Customers
и Orders
таблицы. GetCustomers
Создайте в DataAccessTier
проекте методы и GetOrders
методы.
Создание метода на уровне доступа к данным, возвращающего таблицу клиентов
В Обозреватель решений дважды щелкните NorthwindDataset.xsd, чтобы открыть набор данных.
Щелкните правой кнопкой мыши CustomersTableAdapter и нажмите кнопку "Добавить запрос".
На странице Выбор типа команды оставьте значение по умолчанию для параметра Использовать инструкции SQL и нажмите кнопку Далее.
На странице Выбор типа запроса оставьте значение по умолчанию для параметра Инструкция SELECT, возвращающая строки и нажмите кнопку Далее.
На странице Укажите SQL-инструкцию SELECT оставьте запрос по умолчанию и нажмите кнопку Далее.
На странице Выбор методов для автоматического создания введите GetCustomers для параметра Имя метода в разделе Вернуть таблицу данных (DataTable).
Нажмите кнопку Готово.
Создание метода на уровне доступа к данным, возвращающего таблицу заказов
Щелкните правой кнопкой мыши элемент OrdersTableAdapter и выберите пункт Добавить запрос.
На странице Выбор типа команды оставьте значение по умолчанию для параметра Использовать инструкции SQL и нажмите кнопку Далее.
На странице Выбор типа запроса оставьте значение по умолчанию для параметра Инструкция SELECT, возвращающая строки и нажмите кнопку Далее.
На странице Укажите SQL-инструкцию SELECT оставьте запрос по умолчанию и нажмите кнопку Далее.
На странице Выбор методов для автоматического создания введите GetOrders для параметра Имя метода в разделе Вернуть таблицу данных (DataTable).
Нажмите кнопку Готово.
В меню Сборка выберите Построить решение.
Добавление ссылки на сущность данных и уровни доступа к данным в службу данных
Так как службе данных нужна информация из набора данных и адаптеров таблицы, добавьте ссылки на проекты DataEntityTier и DataAccessTier.
Добавление ссылок в службу данных
Щелкните правой кнопкой мыши DataService в обозревателе решений и выберите команду Добавить ссылку.
Откройте вкладку Проекты в диалоговом окне Добавление ссылки.
Выберите проекты DataAccessTier и DataEntityTier.
Щелкните OK.
Добавление функций в службу для вызова методов GetCustomers и GetOrders на уровне доступа к данным
Теперь, когда уровень доступа к данным содержит методы для возврата данных, создайте в службе данных методы для вызова методов на уровне доступа к данным.
Примечание.
Для проектов C# необходимо добавить ссылку на сборку System.Data.DataSetExtensions
, чтобы следующий код прошел компиляцию.
Создание функций GetCustomers и GetOrders в службе данных
В проекте DataService дважды щелкните IService1.vb или IService1.cs.
Добавьте следующий код под комментарием Добавьте здесь операции служб:
[OperationContract] DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers(); [OperationContract] DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
Примечание.
Код для этого руководства доступен в C# и Visual Basic. Чтобы переключить язык кода на этой странице между C# и Visual Basic, используйте переключатель языка кода в верхней части страницы справа.
В проекте DataService дважды щелкните Service1.vb (или Service1.cs).
Добавьте следующий код в класс 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(); }
В меню Сборка выберите Построить решение.
Создание уровня презентации для отображения данных из службы данных
Теперь, когда решение содержит службу данных, которая имеет методы, которые вызывают уровень доступа к данным, создайте другой проект, который вызывает службу данных и предоставляет данные пользователям. В рамках данного руководства создайте приложение Windows Forms — это уровень представления n-уровневого приложения.
Создание проекта уровня представления
В обозревателе решений щелкните решение правой кнопкой мыши и выберите Добавить>Создать проект.
В диалоговом окне "Новый проект" в левой области выберите "Рабочий стол Windows". В средней области выберите приложение Windows Forms.
Присвойте проекту имя PresentationTier и нажмите кнопку ОК.
Создается проект PresentationTier, который добавляется в решение NTierWalkthrough.
Установка проекта PresentationTier в качестве запускаемого проекта
Мы задали проект PresentationTier для запуска решения, так как это фактическое клиентское приложение, которое представляет и взаимодействует с данными.
Порядок настройки нового проекта уровня представления в качестве запускаемого
- В обозревателе решений щелкните правой кнопкой мыши PresentationTier и выберите команду Назначить запускаемым проектом.
Добавление ссылок на уровень презентации
Клиентскому приложению PresentationTier требуется ссылка на службу в службе данных для получения доступа к методам в этой службе. Кроме того, требуется ссылка на набор данных для обеспечения совместного использования типов службой WCF. Пока вы не включите общий доступ к типам через службу данных, код, добавленный в класс частичного набора данных, недоступен для уровня презентации. Так как обычно вы добавляете код, например код проверки в строку и столбец, изменяющие события таблицы данных, скорее всего, вы хотите получить доступ к этому коду от клиента.
Добавление ссылки на уровень представления
В Обозреватель решений щелкните правой кнопкой мыши PresentationTier и выберите "Добавить ссылку".
В диалоговом окне "Добавить ссылку" выберите вкладку "Проекты".
Выберите DataEntityTier и нажмите кнопку "ОК".
Добавление ссылки на службу на уровень представления
В Обозреватель решений щелкните правой кнопкой мыши PresentationTier и выберите "Добавить ссылку на службу".
В диалоговом окне "Добавить ссылку на службу" нажмите кнопку "Обнаружение".
Выберите "Служба1 " и нажмите кнопку "ОК".
Примечание.
Если на текущем компьютере несколько служб, выберите службу, созданную ранее в этом пошаговом руководстве (служба, содержащая
GetCustomers
методы иGetOrders
методы).
Добавление DataGridViews в форму для отображения данных, возвращаемых службой данных
После добавления ссылки на службу в службу данных окно Источники данных автоматически заполняется возвращенными службой данными.
Создание двух элементов DataGridView с привязкой к данным на форме
Выберите проект PresentationTier в обозревателе решений.
В окне Источники данных разверните NorthwindDataSet и найдите узел Customers.
Перетащите узел Customers на форму Form1.
В окне Источники данных разверните узел Customers и найдите связанный узел Orders (узел Orders вложен в узел Customers).
Перетащите связанный узел Orders на форму Form1.
Создайте обработчик событий
Form1_Load
, дважды щелкнув пустую область на форме.Добавьте следующий код в обработчик событий
Form1_Load
.
Увеличение максимального размера сообщения, разрешенного службой
Значение по умолчанию недостаточно большое, maxReceivedMessageSize
чтобы хранить данные, полученные из Customers
таблиц и Orders
таблиц. В следующих шагах вы увеличите значение до 6553600. Вы изменяете значение на клиенте, которое автоматически обновляет ссылку на службу.
Примечание.
Меньший размер по умолчанию призван ограничить уязвимость для атак типа "отказ в обслуживании" (DoS). Дополнительные сведения см. в разделе MaxReceivedMessageSize.
Увеличение значения maxReceivedMessageSize
В обозревателе решений дважды щелкните файл app.config в проекте PresentationTier.
Найдите атрибут maxReceivedMessageSize и измените значение
6553600
на . Если запись не отображаетсяbasicHttpBinding
, добавьте следующий пример:<system.serviceModel> <bindings> <basicHttpBinding> <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" /> </basicHttpBinding> </bindings> </system.serviceModel>
Тестирование приложения
Запустите приложение, нажав клавишу F5. Данные из таблиц извлекаются из Customers
Orders
службы данных и отображаются в форме.
Следующие шаги
В зависимости от требований приложения может потребоваться выполнить несколько шагов после сохранения связанных данных в приложении под управлением Windows. Ниже приводится перечень рекомендаций, позволяющих улучшить данное приложение.
Добавьте проверку в набор данных.
Добавьте в службу дополнительные методы для обновления данных в базе данных.