##

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

    Государственное образовательное учреждение высшего профессионального образования

    «Нижегородский государственный университет им. Н.И. Лобачевского»

    О. Г. Савихин

    Введение в разработку баз данных
    в Visual Studio .NET с использованием технологии ADO.NET

    Учебно-методическое пособие

    Нижний Новгоpод
    20011

    УДК 519.682

    Савихин О. Г. Введение в разработку баз данных в Visual Studio .NET с использованием технологии ADO.NET.:
    Учебное пособие. -  Нижний Новгород: Издательство Нижегородского госуниверситета, 20011. -  42 с.

    Рецензент:

    Методическое пособие предназначено для студентов механико-математического факультета
     и других факультетов ННГУ и призвано  оказать помощь в практическом использовании персональных компьютеров
    в учебном процессе.

    Нижегоpодский госудаpственный унивеpситет
          им.  Н. И. Лобачевского, 20011

## Содержание

Обзор ADO.NET
Объектная модель ADO.NET
Разработка интерфейса приложения в Microsoft Visual Studio для базы данных на Access
Решение задачи переносимости приложения
Создание базы данных на SQL Server
Список литературы

## Обзор ADO.NET

Краткая история создания ADO.NET
Обзор ADO.NET
Пространство имен ADO.NET
Краткая история создания ADO.NET
Для того чтобы ясно представить себе мотивы создания компанией Microsoft библиотеки ADO.NET, следует рассмотреть ее предыдущие API доступа к данным. В течение последних десяти лет компания Microsoft пыталась решить проблему универсального доступа к данным.
В Microsoft понимали, что для разработчиков всегда важно соблюдение баланса между простотой и производительностью. К сожалению, эти две веши часто были несовместимы. Поскольку доступ к базе данных очень важен для большого числа приложений, в самом начале 90-х годов Microsoft разработала стратегию, нацеленную на помощь своим разработчикам, часто создававшим приложения, которым необходимо было взаимодействовать с базами данных на других платформах, таких, как миникомпьютеры и мэйнфреймы UNIX.
Предложенное Microsoft решение заключалось в использовании интерфейса прикладного программирования (Application Programming Interface — API) ODBC (Open Database Connectivity — открытый интерфейс доступа к базам данных), который позволял получать доступ к данным на подобных системах. Вместе с тем Microsoft знала, что многим разработчикам потребуется также решение для настольных баз данных. Поэтому в 1992 году увидел свет язык Visual Basic 2.0 и интерфейс VT Objects, позволяющий писать на Visual Basic код доступа к ODBC API. VT Objects представлял собой очень простой интерфейс, который обеспечивал немногим более, чем подключение к серверным базам данных. Другими словами, в этом интерфейсе Microsoft представила только ту часть ODBC API, которая могла удовлетворить потребности VB-разработчиков в области доступа к данным. Компании Microsoft также было известно, что разработчики столкнулись с необходимостью локального хранения информации в формате настольной базы данных. В результате компания выпустила настольную базу данных Access 1.0, включающую в себя новую технологию доступа к данным Jet и новую версию интерфейса VT Object с несколько измененным названием — DAO (Data Access Objects — объекты доступа к данным). Уже в первой версии ОАО была представлена концепция объектов Connection и Recordset, которая существует и по сегодняшний день. К сожалению, DАО были присущи и недостатки — отсутствие поддержки многопоточного окружения крайне негативно сказывалось при возрастании нагрузки и при работе в больших клиент-серверных окружениях.
Microsoft попыталась заново "изобрести колесо", выпустив интерфейс доступа к данным OLE DB (OLE for Databases — OLE для баз данных). OLE DB привязывал разработчиков баз данных к модели компонентных объектов Microsoft (Component Object Model — COM). Итак, OLE DB — это набор СОМ-интерфейсов, поддерживающих модель доступа к данным «потребитель/поставщик» на корпоративном уровне. Для OLE DB безразличен источник данных — будь то настольная база данных (например, Access), база данных масштаба предприятия (например, SQL Server или Oracle) или же источник, и вовсе не являющийся базой данных (например, электронная таблица Excel). Если разработчику было нужно предоставить свои данные через OLE DB, он должен был написать поставщик данных OLE DB. К сожалению, создание поставщиков OLE DB оказалось чрезвычайно сложным заданием для большинства разработчиков (разве что за исключением наиболее талантливых С++-программистов). Выпускать потребители данных OLE DB было проще, однако программистам пришлось использовать Visual C++, заплатив за это утратой свободы выбора языка программирования. Одной из последних разработок Microsoft стала технология ActiveX Data Objects (ADO), обеспечивающая СОМ-оболочку для OLE DB. Интерфейс ADO был разработан исключительно с целью упростить работу с OLE DB. Вскоре после выхода ADO разразилась Internet-революция. Разработчикам понадобился легкий в использовании API для того, чтобы сделать свои Web-узлы и Web-приложения ориентированными на взаимодействие с базами данных. Так как код ADO легко встраивался в Web-страницы, новая технология отлично интегрировалась с информационным сервером Internet (Internet Information Server — IIS) и ASP-страницами (Active Server Page — активная серверная страница). Вскоре ADO стал стандартом де-факто для Web-узлов Internet. Действительно, небольшим Web-узлам ADO подходил как нельзя лучше: он был прост для понимания и легок для программирования. Но, к сожалению, ADO не смог справиться с уровнем нагрузки более крупных узлов. Множество Web-страниц регулярно обращались к базе данных для получения одной и той же информации — обнаружилась жесткая зависимость ADO от наличия соединения с базой данных. В соответствии с правилами ADO, для того чтобы запросить информацию из базы данных, с ней сперва необходимо создать соединение. В большинстве случаев соединение с базой данных оставалось открытым на протяжении всего времени манипулирования с объектом Recordset. Это происходило даже при извлечении больших массивов информации. Кроме того, для обеспечения параллелизма в ADO было принято блокировать записи или целые страницы. В результате базы данных испытывали огромную нагрузку, свободные соединения быстро заканчивались, особенно для крупных Web-приложений. Проблема нехватки соединений решалась путем перевода объекта Recordset в отсоединенный режим. Несмотря на то, что это было очень удачное решение, зачастую воспользоваться им могли только наиболее опытные разработчики. Повторно связать объект Recordset с соединением и согласовать его содержимое с содержимым базы данных было чрезвычайно сложно.
Относительно недавно компания Microsoft представила всему миру платформу .NET. Одной из наиболее важных частей этой платформы является библиотека ADO.NET. Фактически ADO.NET — это библиотека .NET-классов, которые позволяют подсоединяться к данным и манипулировать ими. [7]
Обзор ADO.NET
Все типы ADO.NET предназначены для выполнения единого набора задач: установить соединение с хранилищем данных, создать и заполнить данными объект DataSet, отключиться от хранилища дачных и вернуть изменения, внесенные в объект DataSet, обратно в хранилище данных. Объект DataSet — это очень важный и интересный тип данных, представляющий локальный набор таблиц и информацию об отношениях между ними. В некоторых отношениях DataSet очень напоминает рассоединенный Recordset из «старого» ADO. Главное различие между рассоединенным Recordset и DataSet заключается в том, что Recordset представляет собой единственную таблицу, a DataSet — набор связанных таблиц. На практике нам ничто не мешает создать на клиенте объект DataSet, который будет представлять полную копию удаленной базы данных. После создания объекта DataSet и его заполнения данными мы можем программными средствами производить запросы к нему и перемещаться по таблицам. Мы можем выполнять все операции, как при работе с обычными базами данных: добавлять в таблицы новые записи, удалять и изменять существующие, применять к ним фильтры и т. п. После того как клиент завершит внесение изменений, информация о них будет отправлена в хранилище данных для обработки. Объект DataSet создается при помощи управляемого провайдера (managed provider). Управляемый провайдер — это набор классов, реализующих интерфейсы, определенные в пространстве имен System.Data. Речь идет об интерфейсах IDbCommand, IDbDataAdapter, IDbConnection и IDataReader. В состав ADO.NET включены два управляемых провайдера: провайдер SQL и провайдер OleDb. Провайдер SQL специально оптимизирован под взаимодействие с Microsoft SQL Server версии 7.0 и последующих. Для других источников данных предлагается использовать провайдер OleDb, который можно использовать для обращения к любым хранилищам данных, поддерживающим протокол OLE DB. Однако учтите, что провайдер OleDb работает при помощи «родного» OLEDB и требует возможности взаимодействия при помощи СОМ.
Пространство имен ADO.NET
Все возможности ADO.NET заключены в типах, определенных в соответствующих пространствах имен.
• System.Data – это главное пространство имен ADO.NET. В нем определены типы, представляющие таблицы, столбцы, записи, ограничения и, конечно же, самый важный тип — DataSeT. В этом пространстве имен нет типов для подключения к источнику данных — только типы, представляющие сами данные;
• System.Data.Comrnon. Здесь определены типы, общие для всех управляемых провайдеров, многие из них выступают в качестве базовых классов для классов из пространств имен для провайдеров SQL и OleDb;
• System.Data.OleDb. В этом пространстве имен определены типы для установления соединений с OLE DB-совместимыми источниками данных, выполнения к ним SQL-запросов и заполнения данными объектов DataSet. Типы этого пространства имен очень похожи на типы классического ADO;
• System.Data.SqlClient. В этом пространстве имен определены типы, которые и составляют управляемый провайдер SQL С их помощью можно выполнять очень эффективное взаимодействие с Microsoft SQL Server напрямую, минуя промежуточные преобразования (как в случае использования OleDb);
• System.Data.SqlTypes. Представляют собой «родные» типы данных Microsoft SQL Server. Конечно же, можно использовать и стандартные типы данных CLR, но использование типов из этих пространств имен позволяет добиться наивысшей производительности при работе с SQL Server.
Все пространства имен ADO.NET расположены в одной сборке — System.Data.dll. Это означает, что в любом проекте, использующем ADO.NET, мы должны добавить ссылку на эту сборку. В любом приложении ADO.NET необходимо использовать по крайней мере одно пространство имен — System.Data. Кроме того, практически во всех ситуациях потребуется использовать еще либо пространство имен System.Data.OleDb или System.Data.SqlC1ient — для установления соединения с источником данных. [6]

## Объектная модель ADO.NET

Пространства имен
Поставщики данных .NET
Подсоединенные объекты
Отсоединенные объекты
Назначение ADO.NET — помогать разработке эффективных многоуровневых приложений для работы с БД в интрасетях и Интернете, для чего она и предоставляет все необходимые средства. На рисунке показаны классы, составляющие объектную модель ADO.NET. Пунктирная линия делит модель на две части. Объекты в левой части называются подсоединенными (connected). Для управления соединением, транзакциями, выборки данных и передачи изменений они взаимодействуют непосредственно с БД. Объекты в правой части называются отсоединенными (disconnected), они позволяют работать с данными автономно.
Объекты, составляющие отсоединенную часть модели ADO.NET. не взаимодействуют напрямую с подсоединенными объектами. Это — значительное отличие от предыдущих объектных моделей доступа к данным Microsoft.
Пространства имен
Пространство имен - это логическое объединение объектов. Размеры .NET Framework велики, и чтобы упростить разработку приложений на ее основе, Microsoft разделила объекты на пространства имен. На рисунке показана часть иерархии пространств имен в .NET Framework.
Благодаря наличию разных пространств имен, программисты, работающие над разными компонентами, составляющими одно решение, могут использовать одинаковые имена для разных элементов. Поскольку эти имена разделены, в период компиляции они не мешают друг другу. Более практичное применение пространств имен — то, что группировка упрощает поиск объектов.
Поставщики данных .NET
Поставщик данных .NET — это набор классов, предназначенных для взаимодействия с хранилищем данных определенного типа. .NET Framework включает два поставщика — SQL Client .NET Data Provider и OLE DB .NET Data Provider. Поставщик OLE DB .NET Data Provider позволяет взаимодействовать с различными хранилищами данных посредством поставщика OLE DB. Поставщик SQL Client .NET Data Provider рассчитан исключительно на взаимодействие с БД SQL Server версии 7 или более поздней.
У каждого поставщика данных .NET — собственное пространство имен. Оба поставщика из состава .NET Framework относятся к пространству имен System.Data, где находятся отсоединенные объекты. Поставщик OLE DB .NET Data Provider находится в пространстве имен System.Data.OleDb, а поставщик SQL Client .NET Data Provider — в пространстве имен System.Data.SqlClient.
Подсоединенные объекты
Объектная модель ADO.NET включает классы, предназначенные для непосредственного взаимодействия с источником данных. Такие объекты, показанные на рис. 1 слева от пунктирной линии, называют подсоединенными. Большинство из них представляют базовые концепции доступа к данным, например физическое соединение с БД, запрос и результаты запроса.
•Объект Connection
Объект Connection представляет соединение с источником данных. С помощью свойств этого объекта можно задать тип источника, его расположение и другие атрибуты. Он применяется для соединения и отсоединения от БД. Connection выступает в качестве канала, по которому другие объекты, например DataAdapter и Command, взаимодействуют с БД для передачи изменений и выборки их результатов.
•Объект Command
Объекты Command могут представлять запрос к БД, вызов хранимой процедуры или прямой запрос на возврат содержимого конкретной таблицы.
БД поддерживают множество разных типов запросов. Одни запросы возвращают записи данных, ссылаясь на одну или несколько таблиц или представлений или вызывая хранимую процедуру. Другие запросы изменяют записи данных, а все прочие — управляют структурой БД, создавая и изменяя такие объекты как таблицы, представления и хранимые процедуры. С помощью объекта Command удается выполнить любой из этих запросов к БД.
Выполнение запроса к БД с использованием объекта Command осуществляется следующим образом. Необходимо задать свойству Connection одноименный объект, соединяющийся с БД, и затем задать свойству CommandText текст запроса.
Можно также указать имя таблицы, представления или хранимой процедуры и средствами свойства CommandType задать тип выполняемого запроса. Объект Command позволяет выполнять запрос разными способами. Если запрос не возвращает записи, необходимо вызвать метод ExecuteNonQuery. Метод ExecuteReader возвращает объект DataReader, позволяющий просматривать возвращенные запросом записи. У объекта SqlCommand есть третий метод выполнения, ExecuteXmlReader, который аналогичен методу ExecuteReader, но предназначен для работы с запросами, возвращающими результаты в формате XML.
•Объект DataReader
Объект DataReader предназначен для максимально быстрой выборки и просмотра возвращаемых запросом записей. Этот объект позволяет просматривать результаты запроса по одной записи за раз. При переходе к следующей записи содержимое предыдущей записи отбрасывается. Объект DataReader не поддерживает обновление, и возвращаемые им данные доступны только для чтения. Поскольку DataReader реализует лишь ограниченный набор функций, он очень прост и имеет высокую производительность.
•Объект Transaction
Иногда несколько изменений содержимого БД требуется сгруппировать и обрабатывать как единицу работы. В программировании БД такая единица называется транзакцией (transaction). Предположим, БД содержит банковскую информацию и включает таблицы сберегательных и текущих счетов. Если пользователь захотел перевести денежные средства со сберегательного на текущий счет, в коде следует убедиться, что снятие средств со сберегательного счета и внесение их на текущий счет успешно завершились как одна единица работы или что не было сделано ни одного из изменений. Для этого и предназначена транзакция.
У объекта Connection есть метод BeginTransaction, позволяющий создавать объекты Transaction. С помощью объекта Transaction удается подтвердить или отменить все коррективы, сделанные в ходе транзакции. В примере изменения обоих счетов включены в одну транзакцию, и, следовательно, эта процедура подтверждается или отменяется как одна единица работы.
•Объект Parameter
Используется для параметризованных запросов. Многие разработчики интенсивно используют параметризованные запросы, поскольку они упрощают программирование и повышают эффективность кода.
Для применения параметризованного объекта Command необходимо создать объекты Parameter, соответствующие всем параметрам запроса, и добавить их в набор Parameters объекта Command. Объект Parameter ADO.NET предоставляет свойства и методы, позволяющие определить тип данных и значение параметров. Для работы с хранимой процедурой, возвращающей данные посредством параметров вывода, необходимо задать свойству Direction объекта Parameter соответствующее значение из перечисления ParameterDirection.
•Объект DataAdapter
Объект DataAdapter представляет новую концепцию моделей доступа к данным Microsoft.
DataAdapter — это своеобразный мост между БД и отсоединенными объектами модели ADO.NET. Метод DataAdapter.Fill предоставляет эффективный механизм выборки результатов запроса в объект DataSet или DataTable для последующей автономной работы с ними. Кроме того, объекты DataAdapter позволяют передавать отложенные изменения из объектов DataSet в БД.
Объект DataAdapter ADO.NET предоставляет несколько свойств, фактически являющихся объектами Command. Так, свойство SelectCommand содержит объект Command, представляющий собой запрос для заполнения объекта DataSet. Кроме того, у DataAdapter есть свойства InsertCommand, UpdateCommand и DeleteCommand. соответствующие объектам Command для передачи новых, измененных и удаленных записей в БД.
Эти объекты Command предоставляют функциональность обновления.
Объекту DataAdapter ADO.NET требуются отдельные свойства UpdateCommand, InsertCommand и DeleteCommand. Они позволяют определять собственную логику обновления. Свойствам UpdateCommand, InsertCommand и DeleteCommand объекта DataAdapter можно задать вызов хранимой процедуры, изменяющей, добавляющей или удаляющей записи в соответствующей таблице БД. Затем следует вызвать метод DataAdapter.Update, и ADO.NET с помощью созданных вами объектов Command передаст изменения из DataSet в БД.
Как уже говорилось, DataAdapter заполняет таблицы в объекте DataSet, а также считывает кэшированные изменения и передает их в БД. У DataAdapter имеется несколько свойств, позволяющих вести мониторинг всех этих операций. Набор TableMappings — это свойство, позволяющее отслеживать сопоставление таблиц БД с таблицами DataSet. У каждого сопоставления таблиц имеется аналогичное свойство для сопоставления столбцов — набор ColumnMappings.
Отсоединенные объекты
Подсоединенные классы позволяют просматривать данные только в виде непозиционируемого, доступного только для чтения потока.
Объектная модель ADO.NET включает классы, предоставляющие возможность сортировать, выполнять поиск, фильтровать или изменять результаты запросов. Они выступают в качестве автономного кэша данных. Выбрав результаты запроса в объект DataTable, можно закрыть соединение с источником данных и продолжить работу с данными. Как уже говорилось, этим объектам не требуется живое соединение с источником данных, и поэтому они называются отсоединенными (disconnected objects).
Рассмотрим отсоединенные объекты модели ADO.NET.
•Объект DataTable
Объект DataTable ADO.NET позволяет просматривать данные в виде наборов записей и столбцов. Чтобы поместить результаты запроса в объект DataTable, применяют метод DataAdapter.Fill.
Данные, выбранные из БД и помещенные в объект DataTable, считаются отсоединенными от сервера. Содержимое DataTable можно просматривать, не генерируя сетевого трафика между ADO.NET и БД. При автономной работе с данными живое соединение с БД не требуется, но невозможно будет увидеть изменений, внесенных другими пользователями после того, как выполнен исходный запрос.
Класс DataTable содержит наборы других отсоединенных объектов. Для обращения к содержимому DataTable используют свойство Rows, которое возвращает набор объектов DataRow. Чтобы просмотреть структуру DataTable, необходимо воспользоваться свойством Columns и получить набор объектов DataColumn. Класс DataTable также позволяет определять на своем содержимом различные ограничения, например первичный ключ. Обращаться к этим ограничениям можно посредством свойства Constraints объекта DataTable.
•Объект DataColumn
У каждого объекта DataTable есть набор Columns, представляющий собой контейнер объектов DataColumn. Как видно из его названия, объект DataColumn соответствует столбцу таблицы. Тем не менее, в действительности DataColumn содержит не данные, хранящиеся в объекте DataTable, а информацию о структуре столбца. Такая разновидность информации называется метаданными (metadata). Например, объект DataColumn предоставляет свойство Туре, описывающее тип данных (скажем, string или integer) столбца. У DataColumn также есть другие свойства, например ReadOnly, AllowDBNutt, Unique, Default и Autolncrement, позволяющие управлять порядком обновления данных столбца, ограничить диапазон допустимых значений поля и определить порядок генерации значений для новых записей данных.
Класс DataColumn также предоставляет свойство Expression, с помощью которого удается определить порядок вычисления данных в столбце. Распространенная практика — основывать используемый в запросе столбец на выражении, а не на содержимом столбца таблицы БД.
•Объект Constraint
Класс DataTable также позволяет определять на локальном содержимом объектов DataTable различные ограничения. Например, можно создать объект Constraint, гарантирующий, что значения поля или нескольких полей будут уникальны в пределах DataTable. Объекты Constraint хранятся в наборе Constraints объекта DataTable.
•Объект DataRow
Обратиться к реальным значениям, хранящимся в объекте DataTable, позволяет набор Rows, содержащий объекты DataRow. Чтобы просмотреть содержимое конкретного поля определенной записи, необходимо воспользоваться свойством Item соответствующего объекта DataRow и считать значение нужного поля. Класс DataRow предоставляет несколько перегруженных определений свойства Item. Выбрать поле для просмотра можно, передав свойству Item объекта DataRow имя, порядковый номер или сопоставленный с полем объект DataColumn. Item — свойство объекта DataRow по умолчанию, и поэтому его разрешается использовать неявно.
Вместо того чтобы вернуть содержимое только текущей записи, DataTable предоставляет через набор Rows содержимое всех записей данных.
Объект DataRow является также отправной точной обновления. Например, можно вызвать метод DataRowBeginEdit, изменить посредством свойства Item значение одного из полей записи и затем вызвать метод EndEdit, чтобы сохранить сделанное изменение. Метод CancelEdit объекта DataRow отменяет все изменения, сделанные за текущий сеанс редактирования. Кроме того, DataRow предоставляет методы для удаления элементов из набора Rows.
Когда вы изменяете содержимое записи, DataRow кэширует эти изменения, чтобы позже передать их в БД. Таким образом, при изменении значения поля записи DataRow хранит оригинальное и текущее значения поля, что обеспечивает успешное обновление содержимого БД. При наличии отложенных изменений свойство Item объекта DataRow позволяет просматривать оригинальные значения полей.
•Объект DataSet
Как следует из имени, объект DataSet содержит набор данных. DataSet можно рассматривать в качестве контейнера объектов DataTable (хранящихся в наборе Tables объекта DataSet). ADO.NET предназначена упростить разработку крупных многоуровневых приложений для работы с БД. Иногда требуется обратиться к компоненту на промежуточном сервере и выбрать содержимое нескольких таблиц. Вместо того чтобы многократно обращаться к серверу и выбирать данные по одной таблице за раз, можно поместить все данные в объект DataSet и вернуть его за один вызов. Тем не менее, объект DataSet — нечто больше, чем просто контейнер объектов DataTable.
Данные в объекте DataSet отсоединены от БД. Все изменения данных просто кэшируются в объектах DataRow. Когда придет время передать эти изменения в БД окажется неэффективным пересылать промежуточному серверу весь объект DataSet. Стоит воспользоваться методом GetChanges и извлечь из DataSet лишь измененные данные. В результате снизится объем данных, передаваемых между процессами и серверами.
Объект DataSet также предоставляет метод Merge, дополняющий метод GetCbanges. Сервер промежуточного уровня, с помощью которого передаются изменения в БД, может, используя возвращенный методом Merge объект DataSet, вернуть DataSet с только что выбранными из БД данными. Метод Merge позволяет объединить содержимое двух DataSet в один объект. Это еще один пример, подтверждающий, что при разработке ADO.NET учитывалась архитектура многоуровневых приложений. В предыдущих моделях доступа к данным Microsoft аналогичной функции нет.
Создать объект DataSet и заполнить его набор Tables удается и без взаимодействия с БД. В предыдущих моделях доступа к данным перед локальным добавлением новых записей требовалось сначала выполнить запрос к БД и затем позже передать эти новые записи в БД. В ADO.NET взаимодействие с БД требуется только тогда, когда необходимо передать новые записи.
Кроме того, DataSet предоставляет функции чтения и записи в файл и область памяти. Можно сохранить только содержимое объекта DataSet, только его структуру или и то, и другое. ADO.NET хранит эти данные в виде XML-документа. Поскольку ADO.NET и XML тесно связаны, перенос данных из объектов DataSet ADO.NET в XML-документы и обратно осуществляется очень быстро. Это позволяет воспользоваться одной из наиболее мощных функций языка XML — его способностью легко преобразовывать структуру данных. Так, применив XSLT-шаблон, удается преобразовать данные XML-документа в HTML-код.
•Объект DataRelation
Обычно таблицы БД тем или иным образом связаны между собой. В приложении часто требуется использовать связанные данные из нескольких таблиц. Для решения этой задачи применяют объект DataRelation, предоставляемый объектом DataSet.
Класс DataSet определяет свойство Relations, представляющее собой набор объектов DataRelation. Объект DataRelation позволяет определить отношение между объектами DataTable из состава DataSet.
Кроме того, объекты DataRelation предоставляют свойства, позволяющие обеспечить ссылочную целостность. Например, DataRelation можно сконфигурировать так, чтобы изменение значения первичного ключа родительской записи автоматически каскадировалось дочерним записям. Объект DataRelation, кроме того, удается настроить таким образом, что при удалении записи в родительском объекте DataTable автоматически удаляются соответствующие записи дочернего объекта DataTable.
•Объект DataView
Выбрав результаты запроса в объект DataTable, можно посредством объекта DataView просматривать это содержимое разными способами. Если содержимое DataTable требуется упорядочить по определенному полю, нужно задать имя этого поля свойству Sort объекта DataView. Кроме того, свойство Filter объекта DataView позволит выводить только записи, удовлетворяющие заданным критериям. [8]

## Разработка интерфейса приложения в Microsoft Visual Studio для базы данных на Access

Разработку интерфеса проведем для упрощенной базы данных Борей, схема которой приведена на первом рисунке
Файл базы данных можно загрузить с помощью ссылки
Интерфейс готового приложения выглядит следующим образом
Запустить приложение можно с помощью ссылки
Далее приводяться основные шаги разработки приложения. Для работы с базой данных необходимо создать проект WindowsFormAplication. Затем, чтобы создать соединение в окне ServerExplorer необходимо нажать пункт Data Connection и выбрать Add Conectoin.
В появившемся окне Choose Data Sourсe выбрать пункт Microsoft Access Database File и нажать Continue
Для указания пути к файлу в окне Add Connection нажать Browse и выбрать базу данных
Для проверки соединения нажать Test Connection и после появления окна с надписью Test Connection succeeded нажать OK
Появится новый пункт меню Data, в котором нужно выбрать Add New Data Sourсe
В окне Data Sourсe Configuration Wizard выбрать Database и нажать next
Если путь к нужной базе данных указан правильно, нажать next
Далее требуется выбрать нужные таблицы из базы данных в качестве используемых объектов и нажать Finish
Для отображения схемы данных в проекте нужно открыть Solution Explorer (либо на диалоговой панели, либо через пункт меню View), выбрать DataSet.xsd, в начале которого стоит название присоединенной базы данных(в данном проекте это BoreyDataSet.xsd) и нажать на линию, отображающую связь между таблицами, левой клавишей мыши.
Установить настройки всех связей между таблицами, как показано в примере.
Чтобы видеть присоединенные таблицы (запросы) и переносить их на форму для создания интерфейса, в пункте меню Data нужно выбрать Show Data Sourсe
Раскрыв узлы дерева в окне Data Sourсe,можно получить доступ к отдельным полям
Все поля таблицы можно одновременно перенести на форму, использую два способа. В первом случае необходимо выбрать DataGridView, тогда данные отображаются в прямоугольной таблице с сеткой и заголовками. Во втором случае можно выбрать Details,тогда данные отображаются в наборе текстовых редакторов с надписями, совпадающими с именем поля.
Visual Studia .NET позволяет отображать на форме данные не только главной и дочерней таблицы, но и данные таблиц любого уровня подчинения. На рисунке приведен пример из трех таблиц. Главной является таблица Customer, дочерней Orders, которая, в свою очередь является родительской для таблицы OrdersDetails.
Элемент окна ToolBox панель навигации позволяет перемещаться по записям таблицы Customer, при этом отображаются связанные записи в подчиненных таблицах. Чтобы это происходило необходимо установить свойство источника данных DataSource равным имени родительской таблице
По умолчанию отдельные поля таблицы можно перетаскивать в виде элементов TextBox. Но можно раскрыть список и выбрать более сложные интерфейсные элементы.
Удобным способом разработки интерфейса программы для работы с несколькими таблицами является расположение их в отдельных вкладках. Каждая вкладка соответствует главной родительской таблице. На самой вкладке располагаются элементы, отображающие данные из подчиненных таблиц. Данные из родительской таблицы принято отображать с помощью элемента ComboBox, который позволяет организовать быстрый выбор соответствующей записи.
Фирма Microsoft разработала технологию DataBindings, которая позволяет соединить визуальные элементы с источником данных. Практически она выражается в появлении нового раздела DataBindings в окне свойств. Самым сложным с точки зрения количества свойств в этом разделе является элемент ComboBox. Для правильной работы ComboBox в окне свойств Properties необходимо задать значения четырем свойствам: SelectedValue,DataSourсe , DisplayMember, ValueMember, как показано на следующих рисунках. .

##

    Решение задачи переносимости приложения
    Автоматически сгенерированный код классов содержит строку, содержащую полный путь к базе данных.
    При запуске приложения на другом компьютере это обстоятельство может привести к ошибке.
    Для переносимости приложения, используя пункт меню File/open , можно открыть диалог поиска файла базы данных.
    В результате в приложении становится известен новый путь к файлу базы данных.
    Поэтому можно сформировать новую строку подключения
    и изменить свойство ConnectionString у всех объектов DataAdapter, которые используются для доступа к таблицам.
    Эти действия можно организовать в обработчике пункта меню File/open.
    Сюда же необходимо перенести автоматически сгенерированные строки заполнения таблиц данными
    с помощью метода Fill из обработчика загрузки формы. Его тело станет пустым.
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {

    			 }
    private: System::Void openToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
    this->openFileDialog1->ShowDialog();

     String^ s=gcnew String(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+this->openFileDialog1->FileName);

    CustomerTableAdapter->Connection->ConnectionString=s;
    EmploeTableAdapter->Connection->ConnectionString=s;
    ProductTableAdapter->Connection->ConnectionString=s;
    OrdersDetailsTableAdapter->Connection->ConnectionString=s;
    OrdersTableAdapter->Connection->ConnectionString=s;

    this->OrdersDetailsTableAdapter->Fill(this->BoreyDataSet->OrdersDetails);
     this->ProductTableAdapter->Fill(this->BoreyDataSet->Product);
     this->OrdersTableAdapter->Fill(this->BoreyDataSet->Orders);
     this->EmploeTableAdapter->Fill(this->BoreyDataSet->Emploe);
    this->OrdersDetailsTableAdapter->Fill(this->BoreyDataSet->OrdersDetails);
     this->OrdersTableAdapter->Fill(this->BoreyDataSet->Orders);
     this->CustomerTableAdapter->Fill(this->BoreyDataSet->Customer);
    		 }

## Создание базы данных на SQL Server

Для создания соединения SQL Server Express с Microsoft Visual Studio 2005 необходимо знать имя компьютера. Для этого в Моем Компьютере нужно выбрать Панель управления, пункт Система
В свойствах системы в разделе Имя компьютера указано полное имя
Для создания новой базы данных на SQL SERVER в окне Server Explorer открываем контекстное меню и выбираем пункт Create New SQL SERVER Database.
В открывшемся диалоговом окне необходимо ввести имя компьютера и имя сервера, разделенные обратной наклонной чертой. В комплект Microsoft Visual Studio входит упрощенная версия сервера, которая называется SQLEXPRESS. В этом же окне вводим имя новой базы данных.
Для создания таблицы необходимо открыть Server Explorer, щелкнуть правой клавишей мыши на Tables.
Далее нажать пункт Add New Table
В первой колонке пишутся имена полей, во второй их типы
Чтобы установить первичный ключ, используем контекстное меню.
Для сохранения таблицы необходимо выбрать пункт Save Table1, нажав правую клавишу мыши
Далее ввести имя таблицы
Для заполнения таблицы нужно в контексном меню выбрать пункт Show Table Data.
Затем вводим в каждое поле значение в соответствии с его типом.
Разработка схемы связей между таблицами осуществляется с помощью инструмента Database Diagrams.
Создание связей происходит либо автоматически по полям с одинаковыми именами, либо путем перетаскивания поля ключа из родительской таблицы в дочернюю.
Проектирование запросов осуществляется с помощью встроенного мастера, для вызова которого необходимо выбрать пункт контексного меню New Query/

## Список литературы

1. Хомоненко А.Д., Гридин В.В. Microsoft Access. Эксперсс-курс. – СПб.: БХВ-Петербург, 2005. – 304 с.
2. http://books.kulichki.ru Учебники и статьи по базам данных
3. Швецов В.И., Визгунов А.Н,, Мееров И.Б. Базы данных. Учебное пособие. – Н. Новгород: Изд-во ННГУ, 2004. – 271 с.
4. Степаненко О.С. Персональный компьютер. Самоучитель. – М. : Изд. дом «Вильямс»,2003. – 528 с.
5. Шафрин Ю.А. Азбука компьютерных технологий. Образовательная книга-самоучитель для взрослых пользователей ПК IBM PC. – М.: Изд-во Ин-та Психотерапии, 2000. – 640 с.
6. Троелсен Э. С# и платформа .NET. Библиотека программиста. – СПб.:Питер,2004
7. Вилдермьюс Ш. Практическое использование ADO.NET. Доступ к данным в Internet. :Пер. с англ. — М. : Изд. дом "Вильяме", 2003.
8. Сеппа Д.С. Microsoft ADO.NET.:Пер. с англ. — М.: Изд.-торг. дом «Русская Редакция», 2003