Вставка, удаление, обновление записей в базе данных

Метод ExecuteReader() извлекает объект чтения данных, который позволяет просматривать результаты SQL-оператора Select с помощью потока информации, доступного только для чтения в прямом направлении. Однако если требуется выполнить операторы SQL, модифицирующие таблицу данных, то нужен вызов метода ExecuteNonQuery() данного объекта команды. Этот единый метод предназначен для выполнения вставок, изменений и удалений, в зависимости от формата текста команды.
Понятие не запросный (nonquery) означает оператор SQL, который не возвращает результирующий набор. Следовательно, операторы Select представляют собой запросы, а операторы Insert, Update и Delete — нет. Соответственно, метод ExecuteNonQuery() возвращает значение int, содержащее количество строк, на которые повлияли эти операторы, а не новое множество записей.
Чтобы показать, как модифицировать содержимое существующей базы данных с помощью только запроса ExecuteNonQuery(), следующим шагом будет создание собственной библиотеки доступа к данным, в которой инкапсулируется процесс работы с базой данных AutoLot.
В реальной производственной среде ваша логика ADO.NET почти наверняка будет изолирована в .dll-сборке .NET по одной простой причине — повторное использование кода! В предыдущих статьях это не было сделано, чтобы не отвлекать вас от решаемых задач. Но было бы лишними затратами времени разрабатывать ту же самую логику подключения, ту же самую логику чтения данных и ту же самую логику выполнения команд для каждого приложения, которому понадобится работать с базой данных AutoLot.
В результате изоляции логики доступа к данным в кодовой библиотеке .NET различные приложения с любыми пользовательскими интерфейсами (консольный, в стиле рабочего стола, в веб-стиле и т.д.) могут обращаться к существующей библиотеке даже независимо от языка. И если разработать библиотеку доступа к данным на C#, то другие программисты в .NET смогут создавать свои пользовательские интерфейсы на любом языке (например, VB или C++/CLI).
Наша библиотека доступа к данным (AutoLotDAL.dll) будет содержать единое пространство имен (AutoLotConnectedLayer), которое будет взаимодействовать с базой AutoLot с помощью подключенных типов ADO.NET.
Начните с создания нового проекта библиотеки классов (C# Class Library) по имени AutoLotDAL (сокращенно от ‘AutoLot Data Access Layer» — «Уровень доступа к данным AutoLot»), а затем смените первоначальное имя файла C#-кода на AutoLotConnDAL.cs.
Потом переименуйте область действия пространства имен в AutoLotConnectedLayer и измените имя первоначального класса на InventoryDAL, т.к. этот класс будет определять различные члены, предназначенные для взаимодействия с таблицей Inventory базы данных AutoLot. И, наконец, импортируйте следующие пространства имен .NET:
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; namespace AutoLotConnectedLayer < public class InventoryDAL < >>
Добавление логики подключения
Первая наша задача — определить методы, позволяющие вызывающему процессу подключаться к источнику данных с помощью допустимой строки подключения и отключаться от него. Поскольку в нашей сборке AutoLotDAL.dll будет жестко закодировано использование типов класса System.Data.SqlClient, определите приватную переменную SqlConnection, которая будет выделяться при создании объекта InventoryDAL.
Кроме того, определите метод OpenConnection(), а затем еще CloseConnection(), которые будут взаимодействовать с этой переменной:
public class InventoryDAL < private SqlConnection connect = null; public void OpenConnection(string connectionString) < connect = new SqlConnection(connectionString); connect.Open(); >public void CloseConnection() < connect.Close(); >>
Для краткости тип InventoryDAL не будет проверять все возможные исключения, и не будет генерировать пользовательские исключения при возникновении различных ситуаций (например, когда строка подключения неверно сформирована). Однако при создании производственной библиотеки доступа к данным вам наверняка пришлось бы задействовать технику структурированной обработки исключений, чтобы учитывать все аномалии, которые могут возникнуть во время выполнения.
Добавление логики вставки
Вставка новой записи в таблицу Inventory сводится к форматированию SQL-оператора Insert (в зависимости от введенных пользователем данных) и вызову метода ExecuteNonQuery() с помощью объекта команды. Для этого добавьте в класс InventoryDAL общедоступный метод InsertAuto(), принимающий четыре параметра, которые соответствуют четырем столбцам таблицы Inventory (CarID, Color, Make и PetName). На основании этих аргументов сформируйте строку для добавления новой записи. И, наконец, выполните SQL-оператор с помощью объекта SqlConnection:
public void InsertAuto(int id, string color, string make, string petName) < // Оператор SQL string sql = string.Format("Insert Into Inventory" + "(CarID, Make, Color, PetName) Values(@CarId, @Make, @Color, @PetName)"); using (SqlCommand cmd = new SqlCommand(sql, this.connect)) < // Добавить параметры cmd.Parameters.AddWithValue("@CarId", id); cmd.Parameters.AddWithValue("@Make", make); cmd.Parameters.AddWithValue("@Color", color); cmd.Parameters.AddWithValue("@PetName", petName); cmd.ExecuteNonQuery(); >>
Определение классов, представляющих записи в реляционной базе данных — распространенный способ создания библиотеки доступа к данным. Вообще-то, ADO.NET Entity Framework автоматически генерирует строго типизированные классы, которые позволяют взаимодействовать с данными базы. Кстати, автономный уровень ADO.NET генерирует строго типизированные объекты DataSet для представления данных из заданной таблицы в реляционной базе данных.
Создание оператора SQL с помощью конкатенации строк может оказаться опасным с точки зрения безопасности (вспомните атаки вставкой в SQL). Текст команды лучше создавать с помощью параметризованного запроса, который будет описан чуть позже.
Добавление логики удаления
Удаление существующей записи не сложнее вставки новой записи. В отличие от кода InsertAuto(), будет показана одна важная область try/catch, которая обрабатывает возможную ситуацию, когда выполняется попытка удаления автомобиля, уже заказанного кем-то из таблицы Customers. Добавьте в класс InventoryDAL следующий метод:
public void DeleteCar(int id) < string sql = string.Format("Delete from Inventory where CarID = ''", id); using (SqlCommand cmd = new SqlCommand(sql, this.connect)) < try < cmd.ExecuteNonQuery(); >catch (SqlException ex) < Exception error = new Exception("К сожалению, эта машина заказана!", ex); throw error; >> >
Добавление логики изменения
Когда дело доходит до обновления существующей записи в таблице Inventory, то сразу же возникает очевидный вопрос: что именно можно позволить изменять вызывающему процессу: цвет автомобиля, дружественное имя, модель или все сразу? Один из способов максимального повышения гибкости — определение метода, принимающего параметр типа string, который может содержать любой оператор SQL, но это, по меньшей мере, рискованно.
В идеале лучше иметь набор методов, которые позволяют вызывающему процессу изменять записи различными способами. Однако для нашей простой библиотеки доступа к данным мы определим единый метод, который позволяет вызывающему процессу изменить дружественное имя указанного автомобиля:
public void UpdateCarPetName(int id, string newpetName) < string sql = string.Format("Update Inventory Set PetName = '' Where CarID = ''", newpetName, id); using (SqlCommand cmd = new SqlCommand(sql, this.connect)) < cmd.ExecuteNonQuery(); >>
Добавление логики выборки
Теперь необходимо добавить метод для выборки записей. Как было показано ранее, объект чтения данных конкретного поставщика данных позволяет выбирать записи с помощью курсора, допускающего только чтение в прямом направлении. Посредством вызова метода Read() можно обработать каждую запись поочередно. Все это замечательно, но теперь необходимо разобраться, как возвратить эти записи вызывающему уровню приложения.
Одним из подходов может быть получение данных с помощью метода Read() с последующим заполнением и возвратом многомерного массива (или другого объекта вроде обобщенного List).
Еще один способ — возврат объекта System.Data.DataTable, который вообще-то принадлежит автономному уровню ADO.NET. DataTable — это класс, представляющий табличный блок данных (наподобие бумажной или электронной таблицы).
Класс DataTable содержит данные в виде коллекции строк и столбцов. Эти коллекции можно заполнять программным образом, но в типе DataTable имеется метод Load(), который может автоматически заполнять их с помощью объекта чтения данных! Вот пример, где данные из таблицы Inventory возвращаются в виде DataTable:
public DataTable GetAllInventoryAsDataTable() < DataTable inv = new DataTable(); string sql = "Select * From Inventory"; using (SqlCommand cmd = new SqlCommand(sql, this.connect)) < SqlDataReader dr = cmd.ExecuteReader(); inv.Load(dr); dr.Close(); >return inv; >
Работа с параметризованными объектами команд
Пока в логике вставки, изменения и удаления для типа InventoryDAL мы использовали жестко закодированные строковые литералы для каждого SQL-запроса. Вы, видимо, знаете о существовании параметризованных запросов, которые позволяют рассматривать параметры SQL как объекты, а не просто кусок текста.
Работа с SQL-запросами в более объектно-ориентированной манере не только помогает сократить количество опечаток (при наличии строго типизированных свойств), ведь параметризованные запросы обычно выполняются значительно быстрее запросов в виде строковых литералов, поскольку они анализируются только один раз (а не каждый раз, как это происходит, если свойству CommandText присваивается SQL-строка). Кроме того, параметризованные запросы защищают от атак внедрением в SQL (широко известная проблема безопасности доступа к данным).
Для поддержки параметризованных запросов объекты команд ADO.NET поддерживают коллекцию отдельных объектов параметров. По умолчанию эта коллекция пуста, но в нее можно занести любое количество объектов параметров, которые соответствуют в SQL-запросе. Если нужно связать параметр SQL-запроса с членом коллекции параметров некоторого объекта команды, поставьте перед параметром SQL символ @ (по крайней мере, при работе с Microsoft SQL Server, хотя не все СУБД поддерживают это обозначение).
Задание параметров с помощью типа DbParameter
Прежде чем приступить к созданию параметризованных запросов, ознакомимся с типом DbParameter (базовый класс для объектов параметров поставщиков). У этого класса есть ряд свойств, которые позволяют задать имя, размер и тип параметра, а также другие характеристики, например, направление просмотра параметра. Некоторые важные свойства типа DbParameter приведены ниже:
DbType
Выдает или устанавливает тип данных из параметра, представляемый в виде типа CLR
Direction
Выдает или устанавливает вид параметра: только для ввода, только для вывода, для ввода и для вывода или параметр для возврата значения
IsNullable
Выдает или устанавливает, может ли параметр принимать пустые значения
ParameterName
Выдает или устанавливает имя DbParameter
Size
Выдает или устанавливает максимальный размер данных для параметра (полезно только для текстовых данных)
Value
Выдает или устанавливает значение параметра
Для демонстрации заполнения коллекции объектов команд совместимыми с DBParameter объектами переделаем метод InsertAuto() так, что он будет использовать объекты параметров (аналогично можно переделать и все остальные методы, но нам будет достаточно и настоящего примера):
public void InsertAuto(int id, string color, string make, string petName) < // Оператор SQL string sql = string.Format("Insert Into Inventory" + "(CarID, Make, Color, PetName) Values('','','','')", id, make, color, petName); // Параметризованная команда using (SqlCommand cmd = new SqlCommand(sql, this.connect)) < SqlParameter param = new SqlParameter(); param.ParameterName = "@CarID"; param.Value = id; param.SqlDbType = SqlDbType.Int; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Make"; param.Value = make; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Color"; param.Value = color; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@PetName"; param.Value = petName; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); >>
Обратите внимание, что здесь SQL-запрос также содержит четыре символа-заполнителя, перед каждым из которых находится символ @. С помощью свойства ParameterName в типе SqlParameter можно описать каждый из этих заполнителей и задать различную информацию (значение, тип данных, размер и т.д.), причем строго типизированным образом. После подготовки всех объектов параметров они добавляются в коллекцию объекта команды с помощью вызова Add().
Для оформления объектов параметров здесь используются различные свойства. Однако учтите, что объекты параметров поддерживают ряд перегруженных конструкторов, которые позволяют задавать значения различных свойств (что дает более компактную кодовую базу). Учтите также, что в Visual Studio 2010 имеются различные графические конструкторы, которые автоматически создадут за вас большой объем этого утомительного кода работы с параметрами.
Создание параметризованного запроса часто приводит к большему объему кода, но в результате получается более удобный способ для программной настройки SQL-операторов, а также более высокая производительность. Эту технику можно применять для любых SQL-запросов, хотя параметризованные запросы наиболее удобны, если нужно запускать хранимые процедуры.
Использование программы Microsoft Visio для просмотра и изменения схемы базы данных
Помимо инструментов среды Visual Studio .NET, для создания, просмотра и изменения схем базы данных могут использоваться другие очень удобные средства. Программа Microsoft Visio обладает всеми необходимыми возможностями автоматического создания схемы для уже имеющейся базы данных, т.е. реинжиниринга базы данных. Эта функциональная возможность особенно полезна для работы с унаследованными базами данных, которые создавались очень давно и с использованием совсем других инструментов.
Для создания базы данных SQL Server совсем необязательно знать особенности работы с программой Visio. Это всего лишь еще один способ создания и документирования схемы базы с помощью одного набора операций. Если вы предпочитаете использовать компонент Server Explorer среды Visual Studio (или инструмент Enterprise Manager) либо у вас нет программы Visio, то в таком случае можно пропустить данный раздел без ущерба для понимания остального материала.
Реинжиниринг (reverse engineering) базы данных заключается в проверке схемы существующей базы данных и создании диаграммы отношений между объектами базы данных (Entity Relationship Diagram – ERD). ERD-диаграмма — это способ символьного представления базы данных, основанный на широких категориях данных, или сущностях (entities), которые обычно хранятся в базе данных в виде таблиц.
Для реинжиниринга схемы базы данных с помощью программы Visio выполните перечисленные ниже действия.
1. Запустите программу Microsoft Visio 2002 for Enterprise Architects, выбрав команду Start?Programs?Microsoft Visio. В панели Choose Drawing Type (Выбрать тип рисования) выберите категорию Database (База данных).
2. Затем в панели Template (Шаблон) выберите параметр Database Model Diagram (Схема базы данных), и на экране появится основное окно программы Visio (рис. 1.8).
3. Выберите команду меню Database?Reverse Engineer (База данных?Реинжиниринг) для запуска программы-мастера Reverse Engineer Wizard.
4. Из списка Installed Visio drivers (Инсталлированные драйверы Visio) выберите драйвер Microsoft SQL Server.
5. Затем нужно определить источник данных, который позволит получить доступ к базе данных Novelty. Для этого щелкните на кнопке New.
6. На экране появится диалоговое окно Create New Data Source (Создать новый источник данных) с предложением указать тип создаваемого источника данных.
Выберите источник данных System Data Source и щелкните на кнопке Next.

РИС. 1.8. Основное окно программы Visio: слева показан шаблон, а справа – область рисования. Элементы схемы создаются с помощью перетаскивания элементов шаблона в область рисования
7. В следующем окне снова предлагается выбрать драйвер базы данных. Прокрутите список драйверов и выберите SQL Server. Щелкните на кнопке Next, a затем на кнопке Finish.
8. На экране появится новое диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server) с предложением указать источник данных. Введите имя базы данных Novelty в поле Name, а затем в списке с надписью Which SQL Server do you want to connect to? (К какому серверу SQL Server нужно присоединиться?) выберите После этого щелкните на кнопке Next.
9. Укажите режим аутентификации на сервере SQL Server. (Более подробно этот вопрос рассматривается в главе 3, «Знакомство с SQL Server Затем щелкните на кнопке Next.
10. В следующем диалоговом окне установите флажок Change the default database to: (Заменить используемую по умолчанию базу данных:) и выберите в списке базу данных Novelty. Щелкните на кнопке Next, а затем на кнопке Finish.
11. В последнем диалоговом окне ODBC Microsoft SQL Server Setup (Установки параметров драйвера ODBC Microsoft SQL Server) можно протестировать соединение с базой данных с помощью известных параметров соединения. Щелкните на кнопке Test Data Source (Проверка источника данных), чтобы убедиться в работоспособности соединения. После успешной проверки соединения щелкните на кнопке OK.
12. После этого источник данных Novelty будет автоматически выбран и представлен в диалоговом окне программы-мастера Reverse Engineer Wizard. Дважды щелкните на кнопке Next, чтобы пропустить экран для выбора типов объекта.
13. На следующем экране выберите таблицы tblCustomer и tblOrder для выполнения реинжиниринга. Затем щелкните на кнопке Finish. После этого программа Visio самостоятельно создаст схему вашей базы данных, включая отношение междуопределенными ранее таблицами tblCustomer и tblOrder (рис. 1.9).

РИС. 1.9. Схема, созданная с помощью программы-мастера Reverse Engineer Wizard, с двумя таблицами базы данных Novelty и отношениями между ними
В результате такого трудоемкого и рутинного процесса программа-мастер Reverse Engineer Wizard устраняет необходимость использования отдельной программы-мастера для создания источника данных ODBC – устаревшей технологии компании Microsoft, предназначенной для обеспечения взаимодействия приложений с реляционными базами данных. (Более подробно технология ODBC описывалась в прежнем издании книги, но она не очень широко используется в среде Visual Studio .NET, а потому эта тема опущена в данном издании.)
Важной особенностью технологии ODBC является то, что после создания именованного источника данных ODBC его не нужно создавать повторно. Для следующих попыток доступа к базе данных Novelty используется уже созданный источник данных ODBC.
Что нужно сделать для добавления в схему другой таблицы с помощью программы Visio? Напомним, что исходная версия схемы базы данных, созданная Брэдом Джонсом на клочке салфетки, включала возможность отбирать клиентов по региону. Поэтому в данную схему нужно включить таблицу с регионами, выполнив перечисленные ниже действия.
1. В окне Entity Relationship (Отношения между объектами) в левой части окна программы Visio щелкните на компоненте Entity (Объект) и перетащите его в область рисования. При этом будет создан новый объект (таблица), который по умолчанию называется Table 1.
2. Щелкните правой кнопкой мыши на созданном объекте и выберите в контекстном меню команду Database Properties (Свойства базы данных). На экране появится страница свойств базы данных Database Properties.
3. Введите новое имя таблицы tblRegion в текстовом поле Physical name (Физическое имя).
4. В списке Categories (Категории) страницы свойств базы данных Database Properties щелкните на категории Columns (Поля) и создайте три поля в сетке с определением таблицы, как показано на рис. 1.10. Обратите внимание, что для длины поля типа char или varchar нужно выбрать поле и щелкнуть на кнопке Edit (Редактировать) с правой стороны страницы свойств.
После выполнения этих действий схема базы данных будет выглядеть, как показано на рис. 1.10.
Здесь продемонстрирован очень простой способ создания схемы базы данных. Учтите, что в программе Visio есть много других более сложных специализированных шаблонов для создания схем базы данных.
Между таблицами tblRegion и tblCustomer существует отношение на основе связи между их полями State. Для отражения этого отношения в схеме нужно использовать компонент Relationship так, как описано ниже.

РИС. 1.10. ERD-диаграмма с определением новой таблицы tblRegion
1. В окне Entity Relationship (Отношения между объектами) в левой части окна программы Visio щелкните на компоненте Relationship и перетащите его в область рисования. Он представляет собой линию со стрелкой и с зелеными квадратиками (метка-манипулятор) на концах линии.
2. Щелкните и перетащите одну из зеленых меток на таблицу tblRegion. При этом цвет метки станет красным, что означает незавершенность выполняемых действий с данным отношением.
3. Щелкните и перетащите другую зеленую метку на таблицу tblCustomer.
4. В странице свойств в нижней части окна Visio выберите поля State в обеих таблицах, а затем щелкните на кнопке Associate (Связать). Теперь ERD-диаграмма будет выглядеть, как показано на рис. 1.11. Обратите внимание, что кнопка между двумя списками полей из таблиц tblRegion и tblCustomer либо будет неактивной, либо будет содержать надпись Disconnect (Разорвать) или Associate (Связать). Например при выборе по одному полю в каждом списке эта кнопка будет иметь надпись Associate.

Рис. 1.11. ERD-диаграмма с отображением отношения между таблицами tblCustomer и tbIOrder
После создания таблицы в схеме базы данных можно использовать программу Visio для создания таблицы в базе данных. Для этого нужно выбрать команду меню Database?Update (База данных?Обновить). На экране появится диалоговое окно программы-мастера Database Update Wizard с предложением выполнить обновление. Для обновления базы данных можно создать сценарий на языке определения данных (Data Definition Language — DDL), который внесет все необходимые изменения в базу данных. Этот способ позволяет задокументировать все вносимые изменения и использовать их для репликации. (Более подробно DDL рассматривается в главе 2, «Запросы и команды на языке SQL».) Для обновления базы данных программа Visio может просто внести их в базу данных без создания сценария на DDL. Программа-мастер Database Update Wizard позволяет использовать любой из этих вариантов либо оба вместе.
Часто создание графической модели позволяет обнаружить недостатки схемы базы данных. Например, созданная ранее схема позволяет сохранять информацию о клиентах и заказах, но заказы состоят из товаров, взятых со склада компании и проданных клиенту. Однако в данной схеме базы данных не предусмотрена возможность просмотра товаров, заказанных клиентом.
Для решения этой проблемы нужно создать таблицу для хранения сведений о товарах заказа, которая имеет приведенную ниже структуру.
tblOrderItem ID OrderID ItemID Quantity Cost
Теперь между таблицами tblOrder и tblOrderItem существует отношение типа один-ко-многим, как показано на рис. 1.12.
Полностью схему всей базы данных Novelty можно скопировать в виде файла для программы Visio с Web-страницы этой книги на Web-сервере Издательского дома «Вильяме» по адресу: www.williamspublishng.com.
Не следует путать процесс создания схемы базы данных с процессом создания программного обеспечения. В большинстве компаний по созданию программного обеспечения используется методология, которая регламентирует решаемые бизнес-задачи, внешний вид программного обеспечения и способ его создания. Их нужно учитывать при разработке базы данных.
Читайте также
Использование XML DOM для просмотра и изменения ХМL-файла
Использование XML DOM для просмотра и изменения ХМL-файла Объектная модель XML DOM (XML Document Object Model, объектная модель документа XML) является рекомендованным корпорацией W3C стандартом, который определяет интерфейсы, с помощью которых приложения могут загружать XML-файл,
5.4. Программы для просмотра видео
5.4. Программы для просмотра видео Обзор программКак вы знаете, видео может быть записано в форматах AVI, VCD, DVD, MPEG-1, MPEG-2, MPEG-4. Больше всего нас (во всяком случае меня) интересует самый распространенный формат — последний. Своей популярности формат MPEG-4 добился благодаря тому,
Использование скриптов в клиентских приложениях базы данных InterBase
Использование скриптов в клиентских приложениях базы данных InterBase Время от времени у любого программиста появляется желание вынести часть логики своих приложений на уровень, который можно было бы изменять без перекомпиляции приложения. А для определенного класса задач
7.8. Использование базы данных: random, генатом, найтивсе
7.8. Использование базы данных: random, генатом, найтивсе Во всех программах, которые рассматривались до сих пор, база данных использовалась лишь для хранения фактов и правил, с помощью которых определяются предикаты. Можно использовать базу данных и для хранения обычных
Использование инструментов Visual Studio для создания базы данных
Использование инструментов Visual Studio для создания базы данных Существует несколько способов создания баз данных в SQL Server. С помощью набора инструментов SQL Enterprise Manager базы данных можно создавать графически или программно (с помощью команд на языке SQL). Помимо него, существует
Создание схемы базы данных
Создание схемы базы данных Схема базы данных (database diagram) – это визуальное представление таблиц в базе данных. Для создания таблиц и отношений между ними можно использовать инструменты создания схемы баз данных, которые предусмотрены в SQL Server. А для создания схемы баз
Создание базы данных с помощью программы SQL Server Enterprise Manager
Создание базы данных с помощью программы SQL Server Enterprise Manager После регистрации сервера можно приступить к созданию рабочей базы данных и ее объектов: таблиц, представлений и хранимых процедур.Это можно выполнить с помощью команд SQL, но лучше воспользоваться программой SQL
Использование программы SQLServer Enterprise Manager для создания таблиц базы данных SQL Server
Использование программы SQLServer Enterprise Manager для создания таблиц базы данных SQL Server После создания базы данных необходимо создать в ней таблицы. Для этого с помощью программы SQL Server Enterprise Manager выполните ряд действий.1. В окне Microsoft SQL Servers программы SQL Server Enterprise Manager щелкните на
Использование программы SQL Query Analyzer для доступа к базе данных
Использование программы SQL Query Analyzer для доступа к базе данных РИС. 3.13. Основное окно программы SQL Query Analyzer Для выполнения команд SQL Server можно использовать программу SQL Query Analyzer (раньше она называлась ISQLW). С помощью этой программы можно не только осуществлять SQL-запросы, но
Программы для просмотра видео
Программы для просмотра видео Начнем с программ, предназначенных для просмотра видео. В современных дистрибутивах, как правило, все содержится, и при щелчке на видеофайле запустится один из проигрывателей, который начнет его воспроизведение. Несмотря на обилие решений,
Программы для просмотра изображений
Программы для просмотра изображений Под Linux существует множество программ для просмотра изображений во множестве форматов. Популярные файловые менеджеры Nautilus и Konqueror умеют показывать изображения в виде эскизов. При щелчке на изображении в Nautilus обычно вызывается
Поддерживаемые базы данных Microsoft SQL Server
Поддерживаемые базы данных Microsoft SQL Server Допускается подключение к одной из следующих баз данных Microsoft SQL Server:• Microsoft SQL Server 2000 в операционных системах Microsoft Windows 2000 и Microsoft Windows 98 или более поздних версий;• Microsoft SQL Server 2000 Desktop Engine в операционных системах Microsoft Windows 2000 и Microsoft Windows
2.3. Программы для просмотра и редактирования изображений
2.3. Программы для просмотра и редактирования изображений Программы для просмотра и редактирования изображений – важная составляющая в работе с камерой и цифровым фотоархивом. С их помощью вы сможете легко навести порядок на жестком диске, отбросить ненужное и отложить
Другие программы для просмотра ТВ
Другие программы для просмотра ТВ Кроме описанных утилит для просмотра ТВ на компьютере существуют и другие. Будучи ограниченными объемом книги, не станем рассматривать каждую из программ подробно, но небольшое описание некоторых из них все-таки
Программы для просмотра
Программы для просмотра Прежде чем перейти к редактированию графических объектов, познакомимся с программами, которые предназначены для просмотра изображений. Тем более, что многие из них позволяют вносить небольшие изменения.Среди программ этого класса наибольшей
Полное руководство: средства и способы миграции данных в Windows Azure SQL Database
В этом документе представлены рекомендации по миграции определений данных (схем) и данных в базу данных SQL Windows Azure. Эти рекомендации предназначены главным образом для однократного переноса с SQL Server в базу данных SQL. Сведения о совместном использовании данных и резервном копировании базы данных SQL см. в статье SQL Data Sync Overview (Обзор синхронизации данных SQL).
Факторы, которые следует учесть при миграции
Microsoft Windows Azure предоставляет несколько вариантов хранения данных. Можно выбрать один или несколько вариантов для использования в проектах.
База данных SQL Windows Azure является технологией SQL Server, предоставляемой в качестве службы на платформе Windows Azure. Облачные базы данных SQL предоставляют множество преимуществ, включая быструю подготовку, эффективную масштабируемость, высокую доступность и сокращение затрат на управление. База данных SQL поддерживает те же средства и методики разработки, которые используются для локальных приложений SQL Server. Поэтому большинство разработчиков сможет легко создавать облачные решения.
Долгосрочная цель использования SQL Server и базы данных SQL — достижение симметричности и четности компонентов и возможностей. Однако в настоящее время при миграции баз данных в базу данных SQL и разработке решений для базы данных SQL необходимо учитывать особенности архитектуры и способов реализации.
Вначале необходимо изучить отличия между базой данных SQL и SQL Server, а также установить график миграции.
График миграции
Платформа Windows Azure поддерживает три основных способа хранения данных. Хранилище Windows Azure Storage содержит таблицы, BLOB-объекты и очереди. При разработке решения Windows Azure необходимо обеспечить максимальную производительность, выбрав оптимальный способ хранения данных.
| Способы хранения данных | Назначение | Максимальный размер | |
| База данных SQL Windows Azure | Система управления реляционной базой данных | 150 ГБ | |
| Windows Azure Storage (Хранилище Windows Azure) | BLOB-объекты | Надежное хранилище для BLOB-объектов, таких как видео или аудио | 200 ГБ или 1 ТБ |
| Таблица | Надежное хранилище для структурированных данных | 100 ТБ | |
| Очередь | Надежное хранилище для сообщений, передаваемых между процессами | 100 ТБ | |
| Локальное хранилище | Временное хранилище для каждого экземпляра | От 250 ГБ до 2 ТБ |
Локальное хранилище предназначено для временного хранения экземпляра приложения, запущенного локально. Доступ к локальному хранилищу имеет только локальный экземпляр. В случае перезапуска экземпляра на другом оборудовании, например при отключениях, связанных со сбоем или обслуживанием оборудования, данные в локальном хранилище не передаются в экземпляр. Рекомендуется использовать учетную запись хранения Windows Azure или базы данных SQL Windows Azure для обеспечения целостности данных, обмена данными между экземплярами или доступа к данным за пределами Windows Azure.
База данных SQL позволяет обрабатывать данные с помощью запросов, транзакций и хранимых процедур, которые выполняются на стороне сервера и возвращают в приложение только результаты. Если для работы приложения необходима обработка больших наборов данных, рекомендуется использовать базу данных SQL. Для приложения, хранящего и извлекающего большие наборы данных, но не требующего их обработки, лучше выбрать хранилище таблиц Windows Azure.
В настоящее время размер базы данных SQL ограничен 150 ГБ; при этом база данных SQL намного дороже хранилища Windows Azure. Поэтому мы рекомендуем переместить BLOB-объекты в хранилище Windows Azure. Это позволит избежать ограничений, накладываемых на размер базы данных и сократить эксплуатационные расходы.
Сравнение базы данных Windows Azure SQL и SQL Server
SQL Server и база данных SQL имеют одинаковый интерфейс, позволяющий обрабатывать поток табличных данных (Tabular Data Stream, TDS) для доступа к базе данных на основе Transact-SQL. Это позволяет приложениям использовать базу данных SQL так же, как SQL Server.
В отличие от SQL Server, база данных SQL отделяет логическое администрирование от физического. Пользователь может по-прежнему управлять базами данных, учетными записями, пользователями и ролями. Однако управление и настройку физического оборудования, такого как жесткие диски, серверы и хранилища, обеспечивает корпорация Microsoft. Физическое администрирование базы данных SQL осуществляется специалистами компании Microsoft. Поэтому между базой данных SQL и SQL Server существуют отличия в администрировании, подготовке, поддержке Transact-SQL, используемой модели программирования и функциональных возможностях.
Ниже приведен обзор основных отличий.
Размер базы данных
В настоящее время возможно использование двух выпусков базы данных SQL:
- Выпуски Web Edition объемом 1 и 5 ГБ.
- Выпуски Business Edition объемом 10, 20, 30, 40, 50, 100, 150 ГБ.
Проверка подлинности
База данных SQL поддерживает только проверку подлинности SQL. Необходимо определить, требуется ли изменение схемы проверки подлинности, используемой приложением. Дополнительные сведения об ограничениях в сфере безопасности см. в статье Security Guidelines and Limitations (Рекомендации и ограничения в сфере безопасности).
Версия базы данных SQL Server
База данных SQL создана на основе SQL Server 2008 (уровень 100). Чтобы перенести базы данных SQL Server 2000 или SQL Server 2005 в базу данных SQL, необходимо убедиться в их совместимости с SQL Server 2008. Наилучший вариант — миграция с SQL Server 2008 в базу данных SQL. Перед началом миграции в базу данных SQL можно выполнить локальное обновление до SQL Server 2008. При миграции с более ранних версий SQL Server рекомендуется изучить следующие материалы: Upgrading to SQL Server 2008 R2 (Обновление до SQL Server 2008 R2) и Microsoft SQL Server 2008 Upgrade Advisor (Консультант по обновлению Microsoft SQL Server 2008).
Схема
База данных SQL не поддерживает heap-таблицы. ВСЕ таблицы должны иметь кластеризованный индекс. Только в этом случае в них можно добавлять данные. Дополнительные сведения о требовании к кластеризованному индексу см. в статье Inside Windows Azure SQL Database (За кулисами базы данных Windows Azure SQL).
Поддержка Transact-SQL
База данных SQL Windows Azure поддерживает подмножество языка Transact-SQL. Перед развертыванием базы данных в базе данных SQL необходимо изменить сценарий так, чтобы выполнялись только поддерживаемые инструкции Transact-SQL. Дополнительные сведения см. в статьях Supported Transact-SQL Statements (Поддерживаемые инструкции Transact-SQL), Partially Supported Transact-SQL Statements (Частично поддерживаемые инструкции Transact-SQL) и Unsupported Transact-SQL Statements (Неподдерживаемые инструкции Transact-SQL).
Оператор Use
В базе данных SQL оператор USE не выполняет переключения между базами данных. Чтобы сменить базу данных, к ней необходимо подключиться напрямую.
Стоимость
Стоимость подписки на базу данных SQL зависит от количества баз данных и их выпуска. Дополнительная плата взимается за объем данных, переданных в центр обработки данных (ЦОД) или из него. У вас есть выбор: запускать код приложения на локальных серверах и подключаться к базе данных SQL в ЦОД, или запускать код приложения в среде Windows Azure, размещенной в том же ЦОД, что и база данных SQL. Запуск кода приложения в Windows Azure позволяет избежать дополнительных расходов, связанных с оплатой передачи данных. В любом случае следует помнить о задержках при передаче данных через Интернет, которые невозможно устранить ни в одной из этих моделей. Дополнительные сведения см. в статье Pricing Overview (Обзор модели ценообразования).
Ограничения функциональных возможностей
В настоящее время база данных SQL не поддерживает некоторые функции SQL Server, к которым относятся: агент SQL, полнотекстовый поиск, Service Broker, резервное копирование и восстановление, среда CLR и службы интеграции SQL Server Integration Services. Более подробный список приведен в статье SQL Server Feature Limitations (Ограничения функциональных возможностей SQL Server).
Обработка подключений
При использовании облачной базы данных, такой как база данных SQL, требуется подключение к Интернету или другим сложным сетям. Поэтому необходимо быть готовым к обработке неожиданных разрывов соединений.
База данных SQL является крупномасштабной мультитенантной СУБД-службой, размещаемой на общих ресурсах. Для обеспечения удобства работы всех клиентов базы данных SQL, подключение к службе может быть закрыто при возникновении ряда условий.
Ниже приводится список возможных причин разрывов соединения.
Задержка в сети
Задержка приводит к увеличению времени передачи данных в базу данных SQL. Наилучший способ уменьшения влияния задержек — передача данных с помощью нескольких параллельных потоков. Однако эффективность параллелизма ограничивается пропускной способностью сети.
База данных SQL позволяет создать базу данных в различных центрах обработки данных. В зависимости от места нахождения пользователя и возможностей сетевых подключений, показатели задержки в сети между расположением пользователя и каждым центром обработки данных будут разными. Чтобы сократить задержки, следует выбрать центр обработки данных в непосредственной близости от клиентов. Сведения об измерении задержки в сети см. в статье Testing Client Latency to Windows Azure SQL Database (Тестирование задержки клиента при передаче данных в базу данных Windows Azure SQL).
Размещение кода приложения в среде Windows Azure позволит повысить производительность приложения, поскольку в этом случае сокращается задержка в сети, связанная с запросами приложения к базе данных SQL.
Сокращение кругового пути способствует уменьшению количества сетевых проблем.
Отработка отказа базы данных
База данных SQL реплицирует несколько резервных копий данных на несколько физических серверов, обеспечивая доступность информации и непрерывность бизнеса. При отключении, связанном с отказом или обновлением оборудования, база данных SQL обеспечивает автоматический переход на другой ресурс для поддержки максимальной доступности приложения. В настоящее время некоторые действия по отработке отказа приводят к внезапному завершению сеанса.
Распределение нагрузки
Подсистема балансировки нагрузки базы данных SQL обеспечивает оптимальное использование физических серверов и служб в центрах обработки данных. Если показатели использования ресурсов ЦП, задержки ввода-вывода или количества рабочих ролей для компьютера превышают пороговые значения, база данных SQL может прервать выполнение операций и отключить сеансы.
Регулирование количества запросов
Чтобы гарантировать получение всеми подписчиками соответствующей доли общих ресурсов и исключить возможность монополизации ресурсов одними подписчиками за счет других, при определенных условиях база данных SQL может закрыть или отклонить подключения подписчика. Служба регулировки нагрузки на ядро базы данных SQL постоянно контролирует пороговые значения производительности. Это позволяет оценивать состояние системы и регулировать количество запросов пользователей, действия которых влияют на работоспособность системы. Служба отслеживает следующие пороговые значения производительности.
- Объем пространства (в процентах), выделенного физической базе данных SQL. Проценты жесткого и мягкого ограничений одинаковы.
- Объем пространства (в процентах), выделенного файлам журнала базы данных SQL. Файлы журнала общие для всех подписчиков. Проценты жесткого и мягкого ограничений различны.
- Время задержки в миллисекундах при записи на диск журнала. Проценты жесткого и мягкого ограничений различны.
- Время задержки в миллисекундах при чтении файлов данных. Проценты жесткого и мягкого ограничений одинаковы.
- Использование ресурсов ЦП. Проценты жесткого и мягкого ограничений одинаковы.
- Размер отдельных баз данных относительно максимально допустимого размера для подписки базы данных. Проценты жесткого и мягкого ограничений одинаковы.
- Общее количество рабочих ролей, обслуживающих активные запросы к базе данных. Проценты жесткого и мягкого ограничений различны. При превышении этого порогового значения критерии выбора базы данных для блокировки будут отличаться от критериев, применяемых для других пороговых значений. Для баз данных, использующих наибольшее количество рабочих ролей, необходимость регулирования возникает намного чаще, чем для баз данных с наивысшей скоростью трафика.
Лучший способ обработки разрыва соединения — повторное установление соединения и выполнение команд или запросов, которые завершились сбоем. Дополнительные сведения см. в статье Transient Fault Handling Framework (Инфраструктура обработки неустойчивых неисправностей).
Оптимизация баз данных для импорта данных
Чтобы улучшить производительность миграции, в базах данных можно выполнить следующие действия.
- Отложить создание некластеризованных индексов или отключить их. Дополнительные индексы, созданные до загрузки данных, могут значительно увеличить окончательный размер базы данных и замедлить процесс загрузки.
- Отключить триггеры и ограничить объем проверки. При вставке строки в таблицу могут сработать триггеры, и строка будет вставлена в другую таблицу. Срабатывание триггеров может привести к задержкам. Кроме того, пользователю может не потребоваться повторная вставка выбранных элементов.
- Если импортируемые данные отсортированы в таблице в соответствии с кластеризованным индексом, производительность процесса массового импорта повышается. Дополнительные сведения см. в статье Controlling the Sort Order When Bulk Importing Data (Контроль порядка сортировки при массовом импорте данных).
Перемещение больших объемов информации в базу данных SQL
Для переноса больших объемов данных хорошо подходят службы интеграции SQL Server Integration Services (SSIS) и утилита BCP.
При загрузке в базу данных SQL рекомендуется разделить данные на несколько параллельных потоков. Это позволить повысить производительность загрузки.
По умолчанию все строки в файле данных импортируются как один пакет. Для распределения строк по нескольким пакетам рекомендуется указать размер пакета, если он известен. При сбое транзакции пакета выполняется откат вставки только из текущего пакета. Сбой не влияет на состояние пакетов, импортированных ранее с помощью подтвержденных транзакций. Чтобы определить оптимальный размер пакета, рекомендуется провести предварительное тестирование, используя различные настройки размеров пакетов для конкретных сценариев и сред.
Выбор средств миграции
Миграцию базы данных в базу данных SQL можно выполнить, используя различные средства. Как правило, процесс переноса базы данных состоит из миграции схемы и миграции данных. Ниже описаны средства, поддерживающие один из этих процессов или оба. Для создания собственного настраиваемого приложения по отправке данных можно воспользоваться интерфейсом API массового копирования.
Миграция из SQL Server
· Доступна служба для поддержки только облака.
· Открытый исходный код на веб-сайте CodePlex.
Миграция с других RDMS
Помощник по миграции базы данных SQL можно использовать для миграции баз данных Access, MySQL, Oracle, Sybase в базу данных SQL.
Продукт Microsoft с кодовым названием Data Transfer (Передача данных) позволяет переносить в базу данных SQL данные в формате CSV или Excel.
Миграция между базами данных SQL
Для миграции данных из одной базы данных SQL в другую можно использовать копирование и синхронизацию данных SQL.
База данных SQL поддерживает функцию копирования базы данных. При этом в базе данных SQL создается база данных, которая является транзакционно согласованной копией существующей базы данных. Для копирования базы данных нужно подключиться к главной базе данных в базе данных SQL Server, где будет создана новая база данных, и выполнить команду CREATE DATABASE (Создать базу данных):
CREATE DATABASE destination_database_name AS COPY OF
Новая база данных может находиться на том же или другом сервере. Пользователь, выполняющий эту инструкцию, должен иметь роль dbmanager на целевом сервере (для создания базы данных) и роль dbowner в исходной базе данных. Дополнительные сведения см. в статье Copying Databases in Windows Azure SQL Database (Копирование баз данных в базе данных Windows Azure SQL).
Служба синхронизации базы данных SQL позволяет планировать и регулярно выполнять синхронизацию между базой данных SQL и SQL Server, а также между разными базами данных SQL. Дополнительные сведения см. в статье SQL Data Sync Overview (Обзор синхронизации данных SQL).
Использование средств миграции
Пакет приложений уровня данных (Data-tier Application DAC Package)
Приложения уровня данных (Data-tier Applications, DAC) были впервые представлены в SQL Server 2008 R2 и применялись с поддержкой средств разработки в Visual Studio 2010. Они предназначены для упаковки схемы, кода и конфигурации базы данных для развертывания на другом сервере. После подготовки приложений DAC к развертыванию они встраиваются в пакет DAC (BACPAC), который является сжатым файлом с определениями DAC в формате XML. Схему базы данных можно экспортировать из SQL Server Management Studio в пакет DAC, а затем развернуть пакет в базе данных SQL.
Примечание. Формат DACPAC отличается от формата BACPAC. Формат BACPAC является расширением формата DACPAC и включает в себя, наряду со стандартным содержимым файла DACPAC, файл метаданных и данные таблицы, закодированные с помощью JavaScript Object Notation (JSON). Формат BACPAC рассматривается в разделе «Импорт и экспорт DAC».
Перед развертыванием пакет приложения уровня данных можно изменить с помощью Visual Studio 2010. В проекте приложения уровня данных можно указать сценарии, выполняемые до и после развертывания. Это сценарии Transact-SQL, предназначенные для выполнения любых действий, включая вставку данных в сценарии, запускаемые после развертывания. Однако вставлять большие объемы данных с помощью пакета приложения уровня данных не рекомендуется.
Установка и использование
Пакет DAC входит в комплект поставки SQL Server 20008 R2. Миграция схемы базы данных SQL Server в базу данных SQL выполняется в два основных этапа.
Извлечение пакета DAC из базы данных SQL Server.
Для создания пакета DAC на основе существующей базы данных можно воспользоваться мастером извлечения приложений уровня данных. Пакет DAC содержит выбранные из базы данных объекты и связанные объекты уровня экземпляров, например учетные данные пользователей базы данных.
На снимке экрана показано открытие мастера.
Мастер позволяет выполнять следующие основные действия.
- Установка свойств DAC, включая имя приложения уровня данных, версию, описание и расположение файла пакета.
- Проверка совместимости объектов базы данных с приложением уровня данных.
- Формирование пакета.
Развертывание пакета DAC в базе данных SQL.
Для развертывания пакета DAC можно воспользоваться мастером развертывания приложений уровня данных. Сначала необходимо подключиться к серверу базы данных SQL из SQL Server Management Studio. Если база данных не существует, мастер создаст ее. Мастер развернет пакет DAC в экземпляре ядра СУБД, связанном с узлом, который был выбран в иерархии проводника объектов. В примере, приведенном на следующем снимке экрана, мастер развертывает пакет на сервере SQL Server с именем maqqarly23.database.windows.net.
Важно! Перед развертыванием пакета DAC в рабочей среде рекомендуется проверить его содержимое, особенно если этот пакет разрабатывался в другой организации. Дополнительные сведения см. в статье Validate a DAC Package (Проверка пакета DAC).
Ниже описаны основные шаги, выполняемые мастером развертывания приложений уровня данных.
- Выбор пакета DAC.
- Проверка содержимого пакета.
- Настройка свойств развертывания базы данных с указанием базы данных SQL.
- Развертывание пакета.
Вы можете отказаться от использования мастера. Вместо этого для переноса схемы в базу данных SQL можно воспользоваться средой PowerShell с методом dacstore.install().
- Understand Data-tier Applications (Общие сведения о приложениях уровня данных).
- Extract a DAC From a Database (Извлечение пакета DAC из базы данных).
- Deploy a Data-tier Application (Развертывание приложений уровня данных).
Пакет BACPAC приложений уровня данных
Приложение уровня данных — это автономный блок для разработки и развертывания объектов уровня данных, а также управления ими. DAC позволяет разработчикам приложений уровня данных и администраторам баз данных упаковывать объекты Microsoft SQL Server, включая объекты баз данных и объекты экземпляров, в единую сущность, называемую пакетом DAC (файлом DACPAC). Формат BACPAC является расширением формата DACPAC и включает в себя, наряду со стандартным содержимым файла DACPAC, файл метаданных и данные таблицы, закодированные с помощью JavaScript Object Notation (JSON). Базу данных SQL Server можно упаковать в файл BACPAC и использовать его для миграции базы данных в базу данных SQL.
Примечание. DACPAC и BACPAC имеют определенное сходство, но предназначены для использования в совершенно разных сценариях. Пакет DACPAC ориентирован на запись и развертывание схемы. Он применяется, главным образом, для развертывания в среде разработки, тестирования и производства. Пакет BACPAC ориентирован на запись схемы и данных. Он является логическим эквивалентом резервной копии базы данных и не может использоваться для обновления существующих баз данных. BACPAC используется для перемещения базы данных с одного сервера на другой (или в базу данных SQL), а также для архивации существующей базы данных в открытом формате.
В настоящее время служба импорта и экспорта базы данных SQL доступна в виде открытой CTP-версии. С ее помощью можно напрямую импортировать или экспортировать файлы BACPAC между базой данных SQL и хранилищем BLOB-объектов Windows Azure. Служба импорта и экспорта базы данных SQL предоставляет несколько общедоступных конечных точек REST для отправки запросов.
Портал управления платформой Windows Azure имеет интерфейс для вызова службы импорта и экспорта базы данных SQL..
В настоящее время SQL Server Management Studio не поддерживает функцию экспорта базы данных в файл BACPAC. Для импорта и экспорта данными можно воспользоваться интерфейсом API DAC.
В проекте SQL DAC Examples показано использование интерфейса API платформы приложений уровня данных для миграции баз данных с SQL Server в базу данных SQL. Пакет содержит две утилиты командной строки и их исходный код.
Клиентские средства импорта и экспорта DAC используются для экспорта и импорта файлов BACPAC.
Клиент службы импорта и экспорта DAC предназначен для вызова службы импорта и экспорта базы данных SQL, позволяющей импортировать и экспортировать файлы BACPAC между хранилищем BLOLB-объектов Windows Azure и базой данных SQL.
Можно также копировать файл BACPAC в хранилище BLOB-объектов Windows Azure с помощью продукта Microsoft с кодовым названием Data Transfer. Дополнительные сведения см. в разделе, посвященном продукту Microsoft с кодовым названием Data Transfer.
Примечание. В настоящее время возможность импорта и экспорта данных в базу данных SQL с помощью платформы приложений уровня данных доступна только в виде примеров CodePlex. Эти инструменты поддерживаются только сообществом.
Установка и использование
В этом разделе рассматривается использование клиентских средств проекта SQL DAC Examples для миграции базы данных из SQL Server в базу данных SQL.
Проект SQL DAC Examples можно скачать с веб-сайта CodePlex. Для запуска образца на компьютере необходимо установить платформу приложений уровня данных.
Прежде чем использовать средства миграции базы данных, необходимо создать целевую базу данных SQL. При использовании этих средств миграция происходит в два этапа.
Экспорт базы данных SQL Server
Предположим, что существует база данных, на которой запущен SQL Server 2008 R2 с интегрированным защищенным доступом. Базу данных можно экспортировать в файл BACPAC, вызвав образец EXE со следующими аргументами:
DacCli.exe -s serverName -d databaseName -f C:\filePath\exportFileName.bacpac -x -e
Импорт пакета в базу данных SQL
Экспортированный файл можно импортировать в базу данных SQL с помощью следующих аргументов:
DacCli.exe -s serverName.database.windows.net -d databaseName -f C:\filePath\exportFileName.bacpac -i -u userName -p password
- How to Use Data-Tier Application Import and Export with Windows Azure SQL Database (Использование функции импорта и экспорта приложения уровня данных в базе данных Windows Azure SQL).
- DAC Framework Client Side Tools Reference (Справочные материалы о клиентских средствах платформы DAC).
Мастер создания сценариев
Мастер создания сценариев позволяет создавать сценарии Transact-SQL для базы данных SQL Server и связанных объектов в выбранной базе данных. С помощью этих сценариев можно перенести схему и данные в базу данных SQL.
Установка и использование
Мастер создания сценариев входит в состав SQL Server 2008 R2. Мастер можно запустить из SQL Server Management Studio 2008 R2. На следующем снимке экрана показан запуск мастера.
Ниже описаны основные шаги, выполняемые мастером.
- Выбор объектов для экспорта.
- Установка параметров сценария. Можно сохранить сценарий в файл, буфер обмена, окно нового запроса или опубликовать его на веб-сайт.
- Установка дополнительных параметров сценария.
По умолчанию сценарий создается для изолированного экземпляра SQL Server. Чтобы изменить конфигурацию, необходимо нажать кнопку Advanced (Дополнительно) в диалоговом окне Set Scripting Options (Установка параметров сценариев), а затем присвоить свойству Script for the database engine type (Сценарий для типа ядра СУБД) значение SQL Database (База данных SQL).
Утилита bcp
Служебная программа bcp — это инструмент командной строки, предназначенный для высокоуровневой массовой отправки данных в SQL Server или базу данных SQL. Эта программа не является средством миграции. Она не извлекает и не создает схему. Сначала необходимо перенести схему в базу данных SQL с помощью одного из средств миграции схемы.
Примечание. Служебную программу bcp можно использовать для резервного копирования и восстановления данных в базе данных SQL.
Примечание. Мастер миграции базы данных SQL использует программу bcp.
Установка и использование
Программа bcp входит в комплект поставки SQL Server. Версия, входящая в комплект поставки SQL Server 2008 R2 полностью поддерживается базой данных SQL.
При использовании программы bcp миграция происходит в два этапа.
Экспорт данных в файл данных
Для экспорта данных из базы данных SQL Server выполните следующую инструкцию в командной строке:
bcp tableName out C:\filePath\exportFileName.dat –S serverName –T –n -q
Параметр out означает копирование данных из SQL Server. Параметр -n предназначен для выполнения операции массового копирования с помощью собственных типов данных базы данных. Параметр -q предназначен для выполнения инструкции SET QUOTED_IDENTIFIERS ON при взаимодействии между программой bcp и экземпляром SQL Server.
Импорт файла данных в базу данных SQL
Для импорта данных в базу данных SQL необходимо сначала создать схему в целевой базе данных, а затем запустить программу bcp в командной строке:
Bcp tableName in c:\filePath\exportFileName.dat –n –U userName@serverName –S tcp:serverName.database.windows.net –P password –b batchSize
Параметр –b указывает количество строк в каждом пакете импортированных данных. Каждый пакет импортируется и перед подтверждением регистрируется в журнале как отдельная операция импорта всего пакета. Для сокращения количества разрывов подключений к базе данных SQL во время миграции рекомендуется оптимизировать размер пакета.
Ниже приведены практические рекомендации по использованию программы bcp для передачи больших объемов данных.
Используйте параметр –N для передачи данных в основном режиме. В этом случае нет необходимости преобразования типа данных.
Используйте параметр –b, чтобы указать размер пакета. По умолчанию все строки в файле данных импортируются как один пакет. При сбое транзакции выполняется откат только вставок из текущего пакета.
Используйте параметр –h «TABLOCK, ORDER(…)». Параметр –h «TABLOCK» указывает, что на время действия операции массовой загрузки требуется блокировка на уровне таблиц для массового обновления. В противном случае выполняется блокировка на уровне строки. Использование этого параметра позволяет уменьшить число конфликтов при блокировках в таблице. Параметр –h «ORDER(…)» определяет порядок сортировки данных в файле. Если импортируемые данные отсортированы в таблице в соответствии с кластеризованным индексом, производительность процесса массового импорта повышается.
Параметры –F и –L используются для указания первой и последней строки неструктурированного файла при его отправке. Это позволяет избежать физического разделения файла данных для его отправки с использованием нескольких потоков.
Мастер миграции базы данных SQL
Мастер миграции базы данных SQL — это инструмент с открытым исходным кодом для переноса баз данных SQL Server 2005/2008 в базу данных SQL. Он позволяет также выявлять и устранять проблемы с совместимостью и отправлять пользователям уведомления об известных ошибках.
Встроенная логика мастера миграции базы данных SQL обеспечивает обработку разрывов соединения. Транзакции, разделенные на небольшие группы, выполняются до тех пор, пока база данных SQL не завершит соединение. При обнаружении ошибки подключения мастер заново устанавливает связь с базой данных SQL и продолжает обработку команд, которые еще не были выполнены. Аналогичным образом мастер делит данные на небольшие разделы для отправки в базу данных SQL с помощью утилиты bcp. Используя логику для повторных попыток, мастер определяет последнюю запись, успешно отправленную до закрытия соединения. Затем с помощью утилиты bcp мастер перезапускает процесс отправки данных со следующим набором записей.
Примечание. Мастер миграции базы данных SQL — это инструмент с открытым исходным кодом, созданный и поддерживаемый сообществом.
Установка и использование
Мастер миграции базы данных SQL можно скачать с сайта http://sqlazuremw.codeplex.com. Распакуйте пакет на локальном компьютере и запустите программу SQLAzureMW.exe. Ниже приведен снимок экрана приложения.
Основные шаги, выполняемые с помощью мастера.
- Выбор процесса, который необходимо выполнить с помощью мастера.
- Выбор источника, для которого нужно создать сценарий.
- Выбор объектов базы данных, для которых нужно создать сценарий.
- Создание сценария. Созданный сценарий можно изменить.
- Ввод информации для подключения к целевому серверу. Вы можете создать целевую базу данных SQL.
- Выполнение сценария на целевом сервере.
- Using the Windows Azure SQL Database Migration Wizard (Использование мастера миграции базы данных Windows Azure SQL) [видео].
Службы интеграции SQL Server Integration Services
Службы интеграции SQL Server (Server Integration Services, SSIS) используются для выполнения различных задач миграции данных. Это мощный инструмент, способный работать с разнородными источниками и узлами назначения данных. Он обеспечивает поддержку сложных рабочих процессов и преобразований данных между источником и узлом назначения. В настоящее время SSIS не поддерживается базой данных SQL. Тем не менее его можно запустить в локальной системе SQL Server 2008 R2 для передачи данных в базу данных SQL Windows Azure.
С помощью мастера импорта и экспорта SSIS можно создавать пакеты для перемещения данных из единого источника в узел назначения без преобразований. Мастер позволяет работать с источниками и узлами назначения различных типов для быстрого перемещения данных, включая текстовые файлы и другие экземпляры SQL Server.
Установка и использование
Для подключения к базе данных SQL необходимо использовать SSIS версии SQL Server 2008 R2 или адаптеры ADO.NET. Адаптеры ADO.NET дают возможность массовой отправки данных для базы данных SQL. Целевой адаптер ADO.NET предназначен для передачи данных в базу данных SQL. Подключение к базе данных SQL Windows Azure с помощью OLEDB не поддерживается.
Приведенный ниже снимок экрана отображает настройки подключения ADO.NET к базе данных SQL.
При регулировании количества запросов, а также при возникновении проблемы в сети может произойти ошибка передачи пакета. Поэтому рекомендуется формировать пакеты таким образом, чтобы возобновлять их передачу начиная с точки отказа, а не перезапускать процесс заново.
При настройке параметров узла назначения ADO.NET необходимо использовать опцию Use Bulk Insert when possible (По возможности использовать массовую вставку). Массовая загрузка способствует повышению скорости перемещения данных.
Один из способов повышения производительности — разделение исходных данных на несколько файлов в файловой системе. Для обращения к файлам можно использовать компонент «Неструктурированный файл» в конструкторе SSIS. При этом каждый входной файл подключается к компоненту ADO .Net, для которого установлен флажок Use Bulk Insert when possible.
Мастер импорта и экспорта SQL Server
Использование мастера импорта и экспорта SQL Server — это самый простой способ создания пакета служб SQL Server Integration Service для импорта или экспорта. Мастер настраивает подключения, параметры узлов источника и назначения, а также добавляет преобразования данных, необходимые для немедленного запуска процесса импорта или экспорта. Созданный пакет можно изменить в конструкторе SSIS.
Мастер поддерживает следующие источники данных:
- поставщик данных .NET Framework для ODBC;
- поставщик данных .NET Framework для Oracle;
- поставщик данных .NET Framework для SQL Server;
- источник «Неструктурированный файл»;
- поставщик Microsoft OLE DB для служб анализа Analysis Services 10.0;
- поставщик Microsoft OLE DB для службы поиска;
- поставщик Microsoft OLE DB для SQL Server;
- собственный клиент SQL;
- собственный клиент SQL Server версии 10.0.
Примечание. На 64-разрядном компьютере службы интеграции необходимо установить 64-разрядную версию мастера импорта и экспорта SQL Server (DTSWizard.exe). Однако для некоторых источников данных, таких как Access или Excel, доступны только 32-разрядные версии. Для работы с этими источниками данных может потребоваться установка и запуск 32-разрядной версии мастера. Чтобы установить 32-разрядную версию мастера, при установке программы выберите опцию Client Tools (Клиентские средства) или Business Intelligence Development Studio.
Установка и использование
В SQL Server 2008 R2 или более поздней версии, мастер импорта и экспорта SQL Server поддерживает базу данных SQL. Запустить мастер можно несколькими способами.
В меню Start (Пуск) последовательно выберите All Programs (Все программы), Microsoft SQL Server 2008, а затем щелкните Import and Export Data (Импорт и экспорт данных).
При работе с Business Intelligence Development Studio, в Solution Explorer (Обозреватель решений) правой кнопкой мыши щелкните папку SSIS Packages (Пакеты SSIS), затем в контекстном меню выберите пункт SSIS Import and Export Wizard (Мастер импорта и экспорта SSIS).
В меню Project (Проект) Business Intelligence Development Studio выберите пункт SSIS Import and Export Wizard.
В SQL Server Management Studio подключитесь к типу сервера Database Engine (ядро СУБД), разверните узел Databases (Базы данных), щелкните базу данных правой кнопкой мыши и последовательно выберите пункты Tasks (Задачи), Import Data (Импорт данных) или Export data (Экспорт данных).
В окне командной строки запустите файл DTSWizard.exe, находящийся в каталоге C:\Program Files\Microsoft SQL Server\100\DTS\Binn.
В процессе миграции выполняются следующие основные действия.
Выбор источника данных, из которого будут копироваться данные. Выбор узла назначения, в который будут копироваться данные. Для экспорта данных в базу данных SQL в качестве узла назначения следует выбрать .NET Framework Data Provider for SQLServer (Поставщик данных .NET Framework для SQLServer).
Указание копии таблицы или запроса. Выбор исходных объектов. Сохранение и запуск пакета.
Пакет, созданный мастером импорта и экспорта SQL Server, можно сохранить для последующих повторных запусков или для настройки и модернизации в SQL Server Business Intelligence (BI) Development Studio.
Примечание. Перед изменением или запуском в BI Development Studio, сохраненный пакет необходимо добавить в существующий проект служб Integration Services.
- How to: Run the SQL Server Import and Export Wizard (Практическое руководство. Запуск и работа мастера импорта и экспорта SQL Server).
- Using the SQL Server Import and Export Wizard to Move Data (Использование мастера импорта и экспорта SQL Server для миграции данных).
Продукт Microsoft с кодовым названием Database Transfer
Продукт Microsoft с кодовым названием Database Transfer — это облачная служба для передачи данных с компьютера в базу данных SQL или в хранилище BLOB-объектов Windows Azure. Вы можете отправлять данные любого формата в хранилище BLOB-объектов Windows Azure. Вы можете также отправлять данные, хранящиеся в формате CSV или Microsoft Excel (XLSX), в базу данных SQL. Данные, отправляемые в базу данных SQL, преобразуются в таблицы базы данных.
Использование
Служба передачи данных доступна на веб-сайте https://web.datatransfer.azure.com/. Находясь на главной странице, вы можете импортировать данные, а также управлять наборами данных и хранилищами.
Импорт данных в базу данных SQL включает в себя следующие шаги.
- Ввод учетных данных базы данных SQL.
- Выбор файла для передачи.
- Анализ файла и последующая передача данных.
- Microsoft Codename “Data Transfer” Tutorial (Учебник по продукту Microsoft с кодовым названием Data Transfer).
Помощник по миграции SQL Server
Помощник по миграции SQL Server Migration Assistant (SSMA) — это семейство продуктов, позволяющих снизить затраты и уменьшить риски при переносе баз данных Oracle, Sybase, MySQL и Microsoft Access в базу данных SQL или SQL Server. SSMA автоматизирует все составляющие процесса миграции, включая оценку готовности к миграции, преобразование схем и инструкций SQL, перенос данных и проверку результатов миграции.
Установка и использование
SSMA можно скачать из Интернета. Чтобы скачать последнюю версию, перейдите на страницу средств миграции SQL Server. На момент написания этого документа доступны следующие версии:
- Microsoft SQL Server Migration Assistant for Access v5.1 (Помощник по миграции Microsoft SQL Server для Access версии 5.1).
- Microsoft SQL Server Migration Assistant for MySQL v5.1 (Помощник по миграции Microsoft SQL Server для MySQL версии 5.1).
- Microsoft SQL Server Migration Assistant for Oracle v5.1 (Помощник по миграции Microsoft SQL Server для Oracle версии 5.1).
- Microsoft SQL Server Migration Assistant for Sybase v5.1 (Помощник по миграции Microsoft SQL Server для Sybase версии 5.1).
- Microsoft SQL Server Migration Assistant 2008 for Sybase PowerBuilder Applications v1.0 (Помощник миграции Microsoft SQL Server 2008 для приложений Sybase PowerBuilder версии 1.0).
В процессе миграции с использованием SSMA для Access выполняются следующие действия.
- Создание мастера миграции. Выберите базу данных SQL в поле Migrate To (Выполнить миграцию в).
- Добавление баз данных Access.
- Выбор объектов Access для миграции.
- Подключение к базе данных SQL.
- Связывание таблиц. Чтобы использовать существующие приложения Access совместно с базой данных SQL, можно связать исходные таблицы Access с перенесенными таблицами базы данных SQL. При связывании структура базы данных Access модифицируется: теперь вместо базы данных Access для формирования запросов, форм, отчетов и страниц доступа к данным используется база данных SQL.
- Преобразование выбранных объектов.
- Загрузка преобразованных объектов в базу данных SQL.
- Миграция данных для выбранных объектов Access.
- SQL Server Migration Assistant (Помощник по миграции SQL Server).
- Migrating Microsoft Access Applications to Windows Azure SQL Database (Миграция приложений Microsoft Access в базу данных Windows Azure SQL) [видео].
- SQL Server: Manage the Migration (SQL Server, управление миграцией).
- windows azure
- windows azure sql database
- миграция данных
- облачные сервисы
- Блог компании Microsoft
- Microsoft Azure
Обработка баз данных на Visual Basic®.NET
Сердцем многих приложений, работающих в сфере бизнеса, являются базы данных. Своим широким распространением они обязаны возможности централизованного доступа к информации, который характеризуется последовательностью, эффективностью и относительной простотой создания и поддержки. В этой главе рассматриваются основы создания и поддержки баз данных, предназначенных для ведения бизнеса, т.е. здесь вы узнаете, что собой представляет база данных и как ее можно использовать для принятия решений в сфере бизнеса.
Если вы уже работали с языком Visual Basic и программировали доступ к базам данных, то материал этой главы может показаться вам довольно тривиальным. Однако не стоит пропускать ее, поскольку здесь вы найдете профессиональные термины, которые могут меняться при переходе от одной системы управления базами данных (СУБД) к другой.
Несмотря на относительное постоянство концепций, лежащих в основе различных СУБД, одни и те же вещи имеют обыкновение называться по-разному при переходе от одной конкретной реализации к следующей. Например, многие программисты, разрабатывающие приложения клиент/сервер, называют запросы (query), хранимые в контейнере базы данных, представлениями (view), а программисты, работающие в среде Visual Basic или Access, называют их запросами или объектами QueryDef. По своей сути это одно и то же.
Если вы переходите к Visual Basic .NET от предыдущей версии Visual Basic, то вам следует познакомиться с некоторыми новыми возможностями программирования баз данных с помощью Visual Basic .NET. Дело в том, что в ней используется фундаментально другой способ доступа к данным, который отличается от способов доступа к данным в прежних версиях Visual Basic. Он основан на стандартах Internet с прицелом на создание приложений с возможностями удаленного доступа к данным. Интегрированная среда разработки Visual Studio .NET содержит огромный набор визуальных и интуитивно понятных инструментов, которые упрощают и ускоряют процесс создания баз данных и обеспечивают более высокую степень взаимодействия. Ранее для создания и поддержки баз данных необходимо было иметь глубокие знания многих инструментов. С помощью Visual Studio .NET разработчик может обратиться к многочисленным программам-мастерам, что позволяет избежать создания рутинного кода и повысить гибкость создаваемых приложений.
Если же вы не понаслышке знакомы с разработкой баз данных в прежней версии Visual Basic 6.0, возможно, вам имеет смысл забежать вперед и перейти к главе 4, «Модель ADO.NET: провайдеры данных», посвященной новым способам доступа к данным в Visual Basic .NET.
Что представляет собой база данных
База данных (database) — это своего рода камера хранения информации. Поскольку существуют различные типы баз данных, необходимо отметить, что в данной книге рассматриваются реляционные базы данных, как самый распространенный в настоящее время тип баз данных. Реляционные базы данных обладают следующими возможностями:
• сохраняют данные в таблицах, которые, в свою очередь, состоят из строк, называемых здесь записями, и столбцов, называемых здесь полями;
• позволяют считывать подмножества данных из таблиц (или создавать для них запросы);
• позволяют связывать таблицы друг с другом (или создавать объединения) для выборки связанных записей, хранимых в различных таблицах.
Что такое платформа базы данных
Основные функции базы данных обеспечиваются платформой баз данных (database platform), т.е. программной системой, «отвечающей» за способ хранения данных и их выборку.
Вместе с Visual Basic.NET можно использовать множество различных платформ баз данных, но в этой книге в основном рассматривается платформа Microsoft SQL Server 2000. (Более подробно она рассматривается в главе 3, «Знакомство с SQL Server 2000».) Процессором базы данных (database engine) называется сам механизм, лежащий в основе платформы базы данных и непосредственно «отвечающий» за выполнение функций и управление данными.
Бизнес-ситуации
Многие книги, посвященные компьютерному обеспечению, состоят из длинных списков программных средств с кратким описанием особенностей их работы. Если вам повезет, вы найдете описание того, как данный продукт связан с реальным миром.
Цель настоящей книги – представить программное обеспечение в терминах бизнес-решений. Поэтому каждая глава содержит несколько бизнес-вариантов, в которых некая фиктивная компания, столкнувшись с реальными проблемами в сфере бизнеса, пытается автоматизировать работу офиса. В приведенных бизнес-ситуациях используются наработки компании Jones Novelties Incorporated, которая занимается так называемым малым бизнесом — распространением сувениров, мелких дешевых товаров и организацией вечеринок.
Бизнес-ситуация 1.1: основные сведения о компании Jones Novelties Incorporated
Исполнительный директор компании Брэд Джонс сознает, что для процветания компании нужно автоматизировать большую часть проводимых операций. Джонс понимает, что в первую очередь необходимо реализовать такие подсистемы, которые отвечают за контакты с покупателями, складское хозяйство и выписку счетов, причем реализация проекта автоматизации должна максимально отражать специфику этого бизнеса и в то же время отличаться достаточной гибкостью, позволяя вносить потенциальные изменения, продиктованные временем.
Джонс полностью сознает, что успех работы компании во многом зависит от характера организации доступа к информации, и принимает решение использовать для управления информацией компании систему реляционных баз данных. Поэтому последующий материал главы посвящен описанию структуры и особенностей функционирования этой базы данных.
Таблицы и поля
Базы данных состоят из таблиц, которые представляют широкий диапазон категорий данных. Если когда-либо вам приходилось создавать базу данных, например для обработки отчетных материалов в бизнесе, то вы могли создать одну таблицу для хранения информации о клиентах, другую – о счетах, третью – о сотрудниках. Таблицы имеют заранее определенную структуру, и данные, хранящиеся в них, соответствуют этой структуре.
Таблицы содержат записи — отдельные частицы данных внутри широкой категории, которую они представляют. Например, таблица с клиентами содержит информацию обо всех потребителях товаров и услуг данной компании. Записи могут содержать данные практически любого типа. Они могут редактироваться, извлекаться и удаляться с помощью хранимых процедур и/или запросов на языке структурированных запросов (Structured Query Language — SQL).
Записи, в свою очередь, содержат поля. Поле — это некоторый раздел данных в записи. Например, запись, которая представляет некий элемент в адресной книге, может состоять из полей имени и фамилии, адреса, названия города, почтового индекса и номера телефона.
Для доступа к базам данных, таблицам, записям и полям можно использовать код Visual Basic .NET. Одна из новинок программирования баз данных в Visual Basic .NET заключается в строгой проверке типов данных. Например, в Visual Basic .NET предусмотрены новые методы getString() и getInt(), которые позволяют сократить объем вводимого программистом кода и автоматически форматируют извлекаемые данные согласно их типу.
Проектирование базы данных
Для создания базы данных в первую очередь нужно определить, какого рода информацию ей предстоит отслеживать. Затем можно приступать к проектированию, создавая таблицы, состоящие из полей, которые определяют типы хранимых данных. После создания структуры базы данных можно сохранять данные в виде записей.
Однако невозможно добавлять данные в базу данных, которая не имеет таблиц или определений полей, поскольку в этом случае негде хранить данные. Отсюда следует, что проектирование базы данных имеет решающее значение для эффективности ее работы, в частности потому, что структура базы данных после ее реализации порой тяжело поддается изменениям.
В этой книге таблицы представлены в стандартном схематичном формате. В верхней части схемы приводится имя таблицы, а под ним — список названий полей.
| tblMyTable |
|---|
| ID |
| FirstName |
| LastName |
| … |
Многоточие, использованное вместо последнего имени поля, означает, что эта таблица имеет одно или несколько полей, которые для краткости изложения опущены.
Если вы новичок в мире программирования баз данных, но раньше использовали другие компьютерные приложения, вас, возможно, удивит, что приложение базы данных заставляет решать массу проблем еще до того, как вы приступите ко вводу данных. Например, приложение обработки текстов позволяет просто набирать и редактировать текст, а подробности, связанные с сохранением файла, вас не касаются — они решаются самим приложением. Однако с базами данных все обстоит по-другому, потому что заблаговременное проектирование структуры баз данных значительно повышает эффективность работы приложения. Если приложению будет известен точный объем и типы данных, подлежащих хранению, то процесс их сохранения и выборки может быть организован оптимальным образом. Создав свою первую многопользовательскую базу данных на 100 тыс. записей, вы узнаете, что первостепенным фактором в работе базы данных является скорость выборки. Поэтому особого внимания заслуживают любые усилия, направленные на ускорение процесса добавления информации в базу данных и выборки из нее.
Эффективность работы баз данных зависит от продуманности структуры таблиц, т.е. одна и та же таблица должна включать поля, относящиеся к одной и той же категории данных. Это значит, что все записи с данными о клиентах должны храниться в таблице Customer, записи о заказах, оформляемых этими клиентами, — в таблице Orders и т.д.
Хотя эти наборы данных входят в различные таблицы, это вовсе не означает, что вы не можете использовать их вместе. Совсем наоборот. Если необходимые данные расположены в двух или нескольких таблицах реляционной базы данных, вы можете получить доступ к этим данным, используя отношения между таблицами. Отношения будут рассмотрены ниже, а пока остановимся на структуре таблиц.
Бизнес-ситуация 1.2: проектирование таблиц и отношений
Брэд Джонс понял, что компании Jones Novelties Incorporated необходим способ сохранения информации о клиентах. Он совершенно уверен в том, что большинство его деловых контактов не будут однократными, и поэтому хочет иметь возможность связываться с постоянными клиентами, чтобы отсылать им каталоги два раза в год.
Размышляя таким образом за коктейлем, Брэд начертил на салфетке первую схему базы данных. «Итак, – подумал он, – чтобы поддерживать контакты с клиентами, мне нужно хранить следующие данные:
• имя клиента, его адрес, город, штат, почтовый индекс и телефонный номер;
• территориальный регион страны (северо-запад, юго-запад, средний запад, северо-восток, юг или юго-восток);
• дату последней покупки клиента».
Брэд предположил, что всю эту информацию можно поместить в одну таблицу и тогда его база данных будет отличаться изяществом и простотой. Однако в команде разработчиков нашлись отважные люди, которые осмелились сказать своему шефу, что, возможно, он и прав, но построенная таким образом база данных будет неэффективной, неорганизованной и чрезвычайно негибкой.
Информация, которую Брэд хочет включить в таблицу, не преобразуется напрямую в ее поля. Например, поскольку регион является функцией от штата, в котором проживает данный клиент, то вряд ли имеет смысл помещать поля State и Region в одну таблицу. Если все-таки пойти на это, то оператору, занимающемуся вводом данных, придется дважды вводить аналогичную информацию о клиенте. Логичнее хранить поле State в таблице Customer, а остальные сведения, относящиеся к регионам, – в таблице Region. Если по таблице Region всегда можно определить, в каком регионе находится тот или иной штат, то оператору не придется вводить регион для каждого клиента. Вместо этого достаточно ввести только название штата, а затем после обработки данных из таблиц Customer и Region автоматически будет определен регион проживания данного клиента.
Точно так же критически следует посмотреть на поле Name. Если вместо поля Name использовать два поля: FirstName и LastName, то это облегчит сортировку по фамилии клиентов, если таковая потребуется. Подобный аспект проектирования может показаться тривиальным, но остается лишь удивляться тому, сколько проектов баз данных не учитывают таких простых вещей, как эти. Важно понять, что все это гораздо легче предусмотреть на этапе проектирования базы данных, чем пытаться исправить дефекты, вызванные недальновидностью разработчиков, когда база данных уже заполнена информацией.
Поэтому Брэд и его сотрудники решили, что информация о клиентах компании Jones Novelties Incorporated будет храниться в таблице tblCustomer, которая содержит перечисленные ниже поля.
| tblCustomer |
|---|
| ID |
| FirstName |
| LastName |
| Company |
| Address |
| City |
| State |
| PostalCode |
| Phone |
| Fax |
Данные, относящиеся к региону страны, в котором проживает клиент, следует хранить в таблице tblRegion.
| tblRegion |
|---|
| ID |
| State |
| RegionName |
Между двумя этими таблицами существует отношение по полю State. Обратите внимание на то, что это поле присутствует в обеих таблицах. Отношение между таблицами Region и Customer является отношением один-ко-многим, поскольку для каждой записи в таблице tblRegion может существовать или одна, или ни одной, или много записей в таблице tblCustomer, совпадающих по полю State. (Далее в главе подробно описывается, как воспользоваться преимуществами такого отношения при выборке записей.)
Обратите внимание на то, какие имена были присвоены таблицам и полям этой базы данных. Во-первых, имя каждой таблицы начинается с префикса tbl. Этот префикс позволяет с первого взгляда определить, что вы имеете дело именно с таблицей, а не с другим типом объектов базы данных, в котором могут храниться записи. Заметьте, что каждое имя поля состоит из полных слов (а не сокращений), но не включает пробелов или таких специальных символов, как символы подчеркивания.
Несмотря на то что механизм управления базами данных Microsoft SQL Server позволяет использовать в именах объектов баз данных пробелы, символы подчеркивания и другие символы, не входящие в число алфавитно-цифровых, все-таки стоит избегать их использования, поскольку это затрудняет запоминание точного написания имени поля. (В этом случае вам не придется, например, гадать, как называется поле, содержащее имя: FirstName или FIRST_NAME.) Эта директива может показаться сейчас незначительной, но, когда вы начнете писать код для базы данных, содержащей 50 таблиц и 300 полей, вы по достоинству оцените существующие соглашения о присвоении имен, особенно на первом этапе разработки.
Рассмотрим последний пункт из предварительного списка Брэда, предусматривающий регистрацию ответа на вопрос: «Когда данный клиент в последний раз делал у нас покупку?». Разработчик базы данных решил, что эта информация может храниться в таблице, которая предназначена для хранения данных, относящихся к заказам клиентов. Ниже приведена структура этой таблицы.
| tblOrder |
|---|
| ID |
| CustomerID |
| OrderDate |
| Amount |
В этой таблице поле ID уникальным образом идентифицирует каждый заказ. Поле CustomerID, с другой стороны, связывает заказ с клиентом. Чтобы установить эту связь, идентификатор клиента копируется в поле CustomerID таблицы Order. Таким образом, совсем нетрудно отыскать все заказы для конкретного клиента (как будет продемонстрировано ниже).
Манипулирование данными с помощью объектов
После создания таблиц можно приступить к манипуляциям с данными: вводить данные в таблицы, извлекать их из таблиц, проверять и изменять структуру таблиц. Для манипулирования структурой таблиц используются команды определения данных (более подробно они описываются в главе 2, «Запросы и команды на языке SQL»), а для манипулирования данными – объекты DataSet или DataReader платформы .NET.
Объект DataSet обычно представляет подмножество записей, которые извлекаются из базы данных. Оно концептуально аналогично таблице (а в некоторых случаях — группе связанных полей), но также содержит несколько важных собственных свойств. Объекты DataSet можно легко представить в виде XML-данных и использовать для передачи удаленных данных (как, например, при передаче результатов выполнения запроса от сервера к клиенту или при обмене данными между двумя серверами). В Visual Basic .NET объекты DataSet не ограничены только сохранением извлеченных данных. Например, объект DataSet может использоваться для управления статическими данными в XML-документе или файле конфигурации, либо для управления динамическими данными, созданными на основе пользовательских данных в более сложных ситуациях.
Как и при работе с технологией ADO, в Visual Basic .NET и ADO.NET можно использовать подключенные и неподключенные объекты DataSet. Неподключенный объект DataSet с данными передается приложению, соединение с базой данных закрывается, а базе данных ничего не известно о манипуляциях с этими данными до тех пор, пока приложение вновь не обратится к базе данных. Допустим, что пользователь открывает форму и щелкает на кнопке для обновления данных. В таком случае приложение должно снова соединиться с базой данных и выполнить код изменения данных. В то же время с помощью подключенного объекта DataSet используемые данные «блокируются» и все изменения данных мгновенно воспроизводятся в базе данных. Эта технология более подробно рассматривается в главе 5, «ADO.NET: объект DataSet».
Объект DataReader работает аналогично объекту DataSet, но обладает другими возможностями и характеристиками производительности. Одно из отличий отражено в его названии: объект DataReader считывает данные, т.е. он предоставляет доступ к данным только для чтения. Для объекта DataReader также не предусмотрен простой способ представления данных в формате XML.
Для простоты (что также рекомендуется делать на практике) в данной книге объект DataReader используется для выполнения базовых операций доступа к данным, а объект DataSet — только в случае крайней необходимости, например для создания Web-служб (более подробно они рассматриваются в главе 12, «Web-службы и технологии промежуточного уровня»).
Объект DataSet устроен так же, как и объект ADODB.Recordset в прежних версиях языка Visual Basic. Аналогично другим типам объектов языка Visual Basic, объект DataSet имеет свойства и методы. Более подробно он рассматривается в других главах книги, а здесь достаточно отметить, что на платформе .NET объекты используются для организации в приложении ясного, согласованного и относительно простого способа работы с базами данных.
Типы данных
Один из этапов проектирования базы данных заключается в объявлении типа каждого поля, что позволяет процессору базы данных эффективно сохранять и извлекать данные. В SQL Server предусмотрено использование 21 типа данных, которые перечислены в табл. 1.1.
Таблица 1.1. Типы данных в SQL Server
| Тип данных | Описание |
|---|---|
| bigint | Восьмибайтовое целое число в диапазоне от -9223372036854775808 до 9223372036854775807 |
| binary | Двоичные данные фиксированного размера до 8 Кбайт |
| char | Символьное поле фиксированного размера до 8000 символов |
| datetime | Время и дата между 1 января 1753 года и 31 декабря 9999 года |
| decimal | Десятичное число с фиксированной точностью и размером от 5 до 17 байт. Во время создания поля можно указать число десятичных знаков |
| float | Десятичное число размером от 4 до 8 байт и не более 53 десятичных знаков после запятой |
| image | Двоичные данные переменного размера до 2147483647 байт |
| int | Четырехбайтовое целое число в диапазоне от -2147483648 до 2147483647 |
| money | Числовое поле со специальными свойствами для сохранения денежных значений |
| nchar | Символьное поле фиксированного размера до 4000 символов Unicode |
| ntext | Символьное поле произвольного размера до 1 073 741 823 символов Unicode |
| nvarchar | Символьное поле произвольного размера до 4000 символов Unicode |
| real | Десятичное число размером 4 байта и не более 24 десятичных знаков после запятой |
| smalldatetime | Время и дата между 1 января 1900 года и 6 июня 2079 |
| smallint | Двухбайтовое целое число в диапазоне от -32768 до 32767 |
| text | Символьное поле произвольного размера до 2147483647 символов (в базе данных Microsoft Access есть аналогичное поле типа Memo) |
| tinyint | Однобайтовое целое число в диапазоне от 0 до 255 |
| uniqueidentifier | Целое число, которое также называется глобально уникальным идентификатором и используется для уникальной идентификации записи (часто применяется для репликации данных) |
| varbinary | Двоичные данные переменного размера до 8000 байт |
| varchar | Символьные данные переменного размера до 8000 символов |
Хотя типы данных Visual Basic.NET более близки к типам данных полей SQL Server, чем типы данных Visual Basic 6, между ними все равно нет однозначного соответствия. Например, тип данных int в SQL Server соответствует типу integer в Visual Basic .NET, потому что оба они являются 32-битовыми целыми числами. Однако в SQL Server нельзя создать поле с определенным пользователем типом или типом Object языка Visual Basic .NET.
Схема базы данных
Для создания структуры базы данных рекомендуется не только подготовить список таблиц и полей, но и представить таблицы и поля в графическом виде. После этого вы не только сможете сказать, какие таблицы и поля доступны для вас, но и как они связаны друг с другом. Именно для этого и предусмотрена схема базы данных.
Схему можно представить как карту дорог для вашей базы данных. На схеме все таблицы, поля и отношения в базе данных изображаются графически. Схему базы данных важно рассматривать как часть процесса проектирования программного продукта, поскольку с ее помощью можно быстро понять, что происходит в базе данных.
Схемы не теряют своей актуальности и после завершения процесса проектирования базы данных. Без такой схемы вам будет трудно выполнять многотабличные запросы. Толково составленная графическая схема поможет ответить на вопросы типа: «Какие таблицы мне нужно объединить, чтобы составить список всех заказов с объемом, превышающим $50,00, поступивших от клиентов из штата Миннесота в течение последних 24 часов?» (За дополнительной информацией по созданию запросов, включающих более одной таблицы, обращайтесь к главе 2, «Запросы и команды на языке SQL».)
Официальных способов создания схем баз данных не существует, но есть много средств, которыми можно воспользоваться при их создании. Например, графический редактор Visio отличается гибкостью, быстротой и простотой применения. Более того, он хорошо интегрируется с другими приложениями Windows, в частности с Microsoft Office. Этот редактор распространяется отдельно, а также входит в состав Visual Studio.NET Enterprise Architect.
Все сказанное в пользу Visio не означает, что при создании графической схемы базы данных вы должны использовать только программу Visio. Можно применять любые другие инструменты рисования, с которыми вы знакомы. Приемлемый вариант – программа Microsoft Windows Paint, можно также воспользоваться средствами рисования, предусмотренными в программе Microsoft Word.
Использование инструментов Visual Studio для создания базы данных
Существует несколько способов создания баз данных в SQL Server. С помощью набора инструментов SQL Enterprise Manager базы данных можно создавать графически или программно (с помощью команд на языке SQL). Помимо него, существует множество других внешних инструментов для создания баз данных, например Visio, который описывается далее в главе.
Visual Studio .NET также содержит очень удобный инструмент для работы с базами данных SQL Server. Он входит в состав нового компонента Server Explorer, который предназначен для централизованного управления всеми видами серверного программного обеспечения. Для создания базы данных SQL Server с помощью компонента Server Explorer выполните перечисленные ниже действия.
1. Запустите интегрированную среду разработки Visual Studio .NET, выбрав команду меню Start→Programs→Microsoft Visual Studio .NET→Microsoft Visual Studio .NET.
2. В левой части окна Visual Studio .NET откройте окно Server Explorer, выбрав команду меню View→Server Explorer (учтите, что эта вкладка может иметь горизонтальную или вертикальную ориентацию).
3. В этом окне раскройте узел Servers, найдите ваш компьютер, а затем раскройте узел SQL Servers и найдите в нем экземпляр SQL Server, который установлен на вашем компьютере, как показано на рис. 1.1.

РИС. 1.1. Вкладка Server Explorer интегрированной среды разработки Visual Studio .NET, с помощью которой можно централизованно управлять серверными процессами
4. Для создания новой базы данных щелкните правой кнопкой мыши на имени экземпляра SQL Server, который установлен на вашем компьютере. На рис. 1.1 показан компьютер ROCKO, хотя ваш компьютер может иметь совершенно другое имя. В контекстном меню выберите команду New Database (Создать новую базу данных).
5. На экране появится диалоговое окно Create Database (Создать базу данных). Введите в нем имя базы данных Novelty и щелкните на кнопке OK.
6. После этого в окне Server Explorer появится новая база данных Novelty. При раскрытии узла этой базы данных будут отображены следующие категории объектов базы данных:
• Database Diagrams (Диаграммы базы данных);
• Stored Procedures (Хранимые процедуры);
Для использования базы данных нужно создать в ней хотя бы одну таблицу. Для этого выполните перечисленные ниже действия.
1. В окне Server Explorer щелкните правой кнопкой мыши на узле Tables базы данных Novelty, а затем из контекстного меню выберите команду New Table (Создать таблицу).
2. После этого в окне Visual Studio .NET появится диалоговое окно для создания структуры новой таблицы. Создайте таблицу tblCustomer с перечисленными ниже определениями полей.
| Имя поля | Тип данных | Длина | Наличие неопределенных значений |
|---|---|---|---|
| ID | int* | 4 | Нет |
| FirstName | varchar | 20 | Да |
| LastName | varchar | 30 | Да |
| Company | varchar | 50 | Да |
| Address | varchar | 50 | Да |
| City | varchar | 30 | Да |
| State | char | 2 | Да |
| PostalCode | varchar | 9 | Да |
| Phone | varchar | 15 | Да |
| Fax | varchar | 15 | Да |
| varchar | 100 | Да |
Учтите, что поле ID используется для идентификаторов, т.е., оно содержит уникальное целое число для каждой строки данной таблицы.
3. После ввода этих определений таблица будет иметь вид, показанный на рис. 1.2.
4. Щелкните на поле ID и выберите команду меню Diagram→Set Primary Key (Диаграмма→Создать первичный ключ). Благодаря этому все значения данного поля будут уникальны, т.е. все клиенты будут иметь разные идентификаторы. (Более подробные сведения о первичных ключах приводятся в следующем разделе.)
5. Далее нужно указать, что поле ID используется в SQL Server в целях автоматической генерации идентификационных номеров для клиентов. Для этого щелкните правой кнопкой мыши на окне с определением таблицы и выберите в контекстном окне Indexes/Keys (Индексы/ключи).
6. После этого на экране появится диалоговое окно Property Pages (Страницы свойств) со вкладкой Indexes/Keys. Выберите вкладку Tables (Таблицы) со свойствами таблицы.
7. В списке Table Identity Column (Поле таблицы с идентификаторами) выберите поле ID.
8. Щелкните на кнопке Close (Закрыть).

РИС. 1.2. Создание определения таблицы с помощью Visual Studio .NET
9. Выберите команду меню File→Save Table1 (Файл→Сохранить таблицу Table1). В диалоговом окне Choose Name (Выбрать имя) введите имя tblCustomer и щелкните на кнопке OK. Обратите внимание, что после сохранения таблицы ее имя появится в списке таблиц базы данных Novelty в окне компонента Server Explorer.
Определение индексов и первичного ключа
Теперь, когда вы создали базовую таблицу, осталось определить индексы. Индекс (index) — это атрибут, который можно присвоить полю, чтобы облегчить для процессора баз данных выборку данных на основе информации, хранимой в этом поле. Например, в базе данных, содержащей сведения о сотрудниках, вероятно, будет реализована функция поиска клиента по фамилии, отделу или идентификационному номеру. Поэтому для каждого из этих полей имеет смысл создать индексы, чтобы ускорить процесс выборки записей на их основе.
Если вы поняли, какая польза от применения индексов в структуре базы данных, у вас может возникнуть вопрос: если наличие индексов значительно ускоряет поиск, почему бы не создать индексы для каждого поля каждой таблицы? Ответ прост: индексы — это не только плюс, но и минус. При увеличении количества индексов физически увеличивается размер базы данных, а значит, и объем занимаемой памяти и дискового пространства, в результате чего компьютер работает медленнее. В этом случае польза от применения индексов сводится к нулю. Не существует жесткого правила насчет оптимального количества индексов для каждой таблицы, но основная рекомендация состоит в создании индексов только по таким полям, которые, по вашему мнению, будут чаще всего использованы в запросах. (За дополнительной информацией о том, как использовать содержимое поля в качестве критерия запроса для выборки наборов записей, обращайтесь к главе 2, «Запросы и команды на языке SQL».)
Первичный ключ (primary key) – это специальный тип индекса. Поле, которое определено в качестве первичного ключа таблицы, служит для уникальной идентификации записей. Поэтому, в отличие от других типов индексов, никакие две записи в одной и той же таблице не могут иметь одинакового значения в поле их первичного ключа. Кроме того, при определении поля в качестве первичного ключа никакие две записи в этом поле не могут содержать пустое или неопределенное значение (null). Определив некоторое поле таблицы как первичный ключ, вы можете создать в своей базе данных отношения между этой и другими таблицами.
Каждая создаваемая вами таблица должна иметь по крайней мере один первичный ключ и должна быть проиндексирована по тем полям, которые чаще всего будут участвовать в запросах. В случае с таблицей tbl:, как и с многими другими таблицами баз данных, первичный ключ создается по полю ID. (В предыдущем разделе это поле уже было определено как первичное.) Вторичными индексами могут быть поля FirstName и LastName.
Попробуем создать еще два индекса для полей FirstName и LastName, для этого выполните перечисленные ниже действия.
1. Щелкните правой кнопкой мыши на окне с определением таблицы tblCustomer в окне компонента Server Explorer и выберите в контекстном меню команду Indexes/Keys.
2. После этого на экране появится страница свойств со списком существующих индексов, в котором уже присутствует индекс первичного ключа PK_tblCustomer. Щелкните на кнопке New (Создать) для создания нового индекса для поля FirstName.
3. В списке полей выберите поле FirstName, как показано на рис. 1.3, а затем щелкните на кнопке Close.
4. Повторите действия из пп. 1-3, чтобы создать индекс для поля FirstName.
В нижней части диалогового окна Property Pages находится параметр Create UNIQUE (Создать уникальный индекс). Не устанавливайте флажок для этого параметра, потому что в таком случае в таблицу можно будет вводить только разные имена клиентов! Уникальные индексы следует создавать только для того, чтобы гарантировать уникальность значений данного поля.

РИС. 1.3. Диалоговое окно Property Pages после определения индекса для поля FirstName
5. Для сохранения внесенных изменений в базу данных выберите команду меню File→Save tblCustomer (Файл→Сохранить таблицу tblCustomer). После успешного сохранения внесенных изменений закройте окно создания схемы базы данных Visual Studio .NET.
Создав структуру данных для таблицы, можно приступить к вводу данных в нее. В окне Server Explorer предусмотрены удобные средства ввода данных в таблицу. Для этого нужно щелкнуть правой кнопкой мыши на таблице в окне Server Explorer и выбрать из контекстного меню команду Retrieve Data from Table (Извлечь данные из таблицы). В результате в окне Server Explorer появится сетка с полями ввода данных (рис. 1.4).
Данные вводятся непосредственно в каждую ячейку сетки, а при переходе к следующей строке данные из предыдущей строки сохраняются в базе данных. Учтите, что в поле данные можно не вводить – они будут вводиться в него автоматически, поскольку оно было создано как поле с идентификаторами. Процессор базы данных автоматически будет заполнять это поле значениями при переходе к следующей строке сетки.
Получив эти базовые знания о создании таблицы с помощью Visual Studio .NET, вы сможете создавать базы данных практически любого вида. Однако для создания сложных баз данных с несколькими таблицами часто требуется установить отношения (связи) между ними. Чтобы упростить эту задачу, используется схема базы данных.
Создание схемы базы данных
Схема базы данных (database diagram) – это визуальное представление таблиц в базе данных. Для создания таблиц и отношений между ними можно использовать инструменты создания схемы баз данных, которые предусмотрены в SQL Server. А для создания схемы баз данных с помощью окна Server Explorer среды Visual Studio .NET выполните перечисленные ниже действия.

РИС. 1.4. Ввод данных в таблицу с помощью команды контекстного меню Retrieve Data from Table
1. Разверните узел базы данных Novelty в окне Server Explorer, щелкните правой кнопкой мыши на узле Database Diagrams и выберите в контекстном меню команду New Diagram (Создать схему).
2. В диалоговом окне Add Table (Добавить таблицу) будет приведен список таблиц базы данных. Выберите созданную ранее таблицу tblCustomer, щелкните на кнопке Add (Добавить), а затем на кнопке Close.
3. В результате будет создана новая схема базы данных с таблицей tblCustomer (рис. 1.5).
4. Для добавления второй таблицы в эту схему щелкните правой кнопкой мыши на пустом пространстве возле таблицы tblCustomer и выберите в контекстном меню команду New Table (Создать таблицу).
5. На экране появится диалоговое окно Choose Name, в которое следует ввести имя новой таблицы tblOrder.
6. После этого в окне схемы появится сетка для определения полей новой таблицы. Создайте в ней поля, показанные на рис. 1.6.
7. Выберите команду меню File→Save для сохранения схемы базы данных, и на экране появится диалоговое окно с просьбой подтвердить создание новой таблицы. Щелкните на кнопке Yes, и в окне Server Explorer появится вновь созданная таблица.

РИС. 1.5. Схема базы данных Novelty, которая содержит все таблицы, выбранные в диалоговом окне Add Table

РИС. 1.6. Схема базы данных Novelty, которая содержит все таблицы, выбранные в диалоговом окне Add Table
После создания таблиц для клиентов и заказов следует установить связь (отношение) между ними. Например, при создании заказа идентификатор клиента ID из таблицы tblCustomer копируется из записи клиента в поле CustomerID таблицы tblOrder. Для указания этого отношения между таблицами на схеме базы данных выполните перечисленные ниже действия.
1. Щелкните на поле ID в таблице tblCustomer и перетащите его к полю CustomerID таблицы tblOrder.
2. На экране появится диалоговое окно Create Relationship (Создать отношение), в котором можно указать свойства отношения между двумя таблицами. После этого уже нельзя создавать заказы для клиентов с идентификаторами, которых нет в таблице клиентов. Это ограничение имеет большое практическое значение и потому с ним следует согласиться.
3. Схема базы данных обновляется для отражения нового отношения, как показано на рис. 1.7.

РИС. 1.7. Схема базы данных с обозначением отношения между табл tblCustomer и tblOrder
Для сохранения созданной схемы базы данных DatabaseDiagram1 выберите команду File→Save DatabaseDiagram1. В диалоговом окне Save New Database Diagram (Сохранить имя новой схемы базы данных) введите имя Relationships (Отношения) для новой схемы базы данных. При этом возможно появление диалогового окна с просьбой подтвердить создание новой таблицы. Щелкните на кнопке Yes для сохранения вновь созданной таблицы tblOrder.
SQL Server может сохранять схему базы данных вместе с самой базой данных. Таким образом, всегда можно получить доступ к схеме, даже с помощью других инструментов, например с помощью программы Enterprise Manager или среды Visual Studio .NET.
Использование программы Microsoft Visio для просмотра и изменения схемы базы данных
Помимо инструментов среды Visual Studio .NET, для создания, просмотра и изменения схем базы данных могут использоваться другие очень удобные средства. Программа Microsoft Visio обладает всеми необходимыми возможностями автоматического создания схемы для уже имеющейся базы данных, т.е. реинжиниринга базы данных. Эта функциональная возможность особенно полезна для работы с унаследованными базами данных, которые создавались очень давно и с использованием совсем других инструментов.
НА 3AMETKУ
Для создания базы данных SQL Server совсем необязательно знать особенности работы с программой Visio. Это всего лишь еще один способ создания и документирования схемы базы с помощью одного набора операций. Если вы предпочитаете использовать компонент Server Explorer среды Visual Studio (или инструмент Enterprise Manager) либо у вас нет программы Visio, то в таком случае можно пропустить данный раздел без ущерба для понимания остального материала.
Реинжиниринг (reverse engineering) базы данных заключается в проверке схемы существующей базы данных и создании диаграммы отношений между объектами базы данных (Entity Relationship Diagram – ERD). ERD-диаграмма — это способ символьного представления базы данных, основанный на широких категориях данных, или сущностях (entities), которые обычно хранятся в базе данных в виде таблиц.
Для реинжиниринга схемы базы данных с помощью программы Visio выполните перечисленные ниже действия.
1. Запустите программу Microsoft Visio 2002 for Enterprise Architects, выбрав команду Start→Programs→Microsoft Visio. В панели Choose Drawing Type (Выбрать тип рисования) выберите категорию Database (База данных).
2. Затем в панели Template (Шаблон) выберите параметр Database Model Diagram (Схема базы данных), и на экране появится основное окно программы Visio (рис. 1.8).
3. Выберите команду меню Database→Reverse Engineer (База данных→Реинжиниринг) для запуска программы-мастера Reverse Engineer Wizard.
4. Из списка Installed Visio drivers (Инсталлированные драйверы Visio) выберите драйвер Microsoft SQL Server.
5. Затем нужно определить источник данных, который позволит получить доступ к базе данных Novelty. Для этого щелкните на кнопке New.
6. На экране появится диалоговое окно Create New Data Source (Создать новый источник данных) с предложением указать тип создаваемого источника данных.
Выберите источник данных System Data Source и щелкните на кнопке Next.

РИС. 1.8. Основное окно программы Visio: слева показан шаблон, а справа – область рисования. Элементы схемы создаются с помощью перетаскивания элементов шаблона в область рисования
7. В следующем окне снова предлагается выбрать драйвер базы данных. Прокрутите список драйверов и выберите SQL Server. Щелкните на кнопке Next, a затем на кнопке Finish.
8. На экране появится новое диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server) с предложением указать источник данных. Введите имя базы данных Novelty в поле Name, а затем в списке с надписью Which SQL Server do you want to connect to? (К какому серверу SQL Server нужно присоединиться?) выберите После этого щелкните на кнопке Next.
9. Укажите режим аутентификации на сервере SQL Server. (Более подробно этот вопрос рассматривается в главе 3, «Знакомство с SQL Server Затем щелкните на кнопке Next.
10. В следующем диалоговом окне установите флажок Change the default database to: (Заменить используемую по умолчанию базу данных:) и выберите в списке базу данных Novelty. Щелкните на кнопке Next, а затем на кнопке Finish.
11. В последнем диалоговом окне ODBC Microsoft SQL Server Setup (Установки параметров драйвера ODBC Microsoft SQL Server) можно протестировать соединение с базой данных с помощью известных параметров соединения. Щелкните на кнопке Test Data Source (Проверка источника данных), чтобы убедиться в работоспособности соединения. После успешной проверки соединения щелкните на кнопке OK.
12. После этого источник данных Novelty будет автоматически выбран и представлен в диалоговом окне программы-мастера Reverse Engineer Wizard. Дважды щелкните на кнопке Next, чтобы пропустить экран для выбора типов объекта.
13. На следующем экране выберите таблицы tblCustomer и tblOrder для выполнения реинжиниринга. Затем щелкните на кнопке Finish. После этого программа Visio самостоятельно создаст схему вашей базы данных, включая отношение междуопределенными ранее таблицами tblCustomer и tblOrder (рис. 1.9).

РИС. 1.9. Схема, созданная с помощью программы-мастера Reverse Engineer Wizard, с двумя таблицами базы данных Novelty и отношениями между ними
В результате такого трудоемкого и рутинного процесса программа-мастер Reverse Engineer Wizard устраняет необходимость использования отдельной программы-мастера для создания источника данных ODBC – устаревшей технологии компании Microsoft, предназначенной для обеспечения взаимодействия приложений с реляционными базами данных. (Более подробно технология ODBC описывалась в прежнем издании книги, но она не очень широко используется в среде Visual Studio .NET, а потому эта тема опущена в данном издании.)
Важной особенностью технологии ODBC является то, что после создания именованного источника данных ODBC его не нужно создавать повторно. Для следующих попыток доступа к базе данных Novelty используется уже созданный источник данных ODBC.
Что нужно сделать для добавления в схему другой таблицы с помощью программы Visio? Напомним, что исходная версия схемы базы данных, созданная Брэдом Джонсом на клочке салфетки, включала возможность отбирать клиентов по региону. Поэтому в данную схему нужно включить таблицу с регионами, выполнив перечисленные ниже действия.
1. В окне Entity Relationship (Отношения между объектами) в левой части окна программы Visio щелкните на компоненте Entity (Объект) и перетащите его в область рисования. При этом будет создан новый объект (таблица), который по умолчанию называется Table 1.
2. Щелкните правой кнопкой мыши на созданном объекте и выберите в контекстном меню команду Database Properties (Свойства базы данных). На экране появится страница свойств базы данных Database Properties.
3. Введите новое имя таблицы tblRegion в текстовом поле Physical name (Физическое имя).
4. В списке Categories (Категории) страницы свойств базы данных Database Properties щелкните на категории Columns (Поля) и создайте три поля в сетке с определением таблицы, как показано на рис. 1.10. Обратите внимание, что для длины поля типа char или varchar нужно выбрать поле и щелкнуть на кнопке Edit (Редактировать) с правой стороны страницы свойств.
После выполнения этих действий схема базы данных будет выглядеть, как показано на рис. 1.10.
НА ЗАМЕТКУ
Здесь продемонстрирован очень простой способ создания схемы базы данных. Учтите, что в программе Visio есть много других более сложных специализированных шаблонов для создания схем базы данных.
Между таблицами tblRegion и tblCustomer существует отношение на основе связи между их полями State. Для отражения этого отношения в схеме нужно использовать компонент Relationship так, как описано ниже.

РИС. 1.10. ERD-диаграмма с определением новой таблицы tblRegion
1. В окне Entity Relationship (Отношения между объектами) в левой части окна программы Visio щелкните на компоненте Relationship и перетащите его в область рисования. Он представляет собой линию со стрелкой и с зелеными квадратиками (метка-манипулятор) на концах линии.
2. Щелкните и перетащите одну из зеленых меток на таблицу tblRegion. При этом цвет метки станет красным, что означает незавершенность выполняемых действий с данным отношением.
3. Щелкните и перетащите другую зеленую метку на таблицу tblCustomer.
4. В странице свойств в нижней части окна Visio выберите поля State в обеих таблицах, а затем щелкните на кнопке Associate (Связать). Теперь ERD-диаграмма будет выглядеть, как показано на рис. 1.11. Обратите внимание, что кнопка между двумя списками полей из таблиц tblRegion и tblCustomer либо будет неактивной, либо будет содержать надпись Disconnect (Разорвать) или Associate (Связать). Например при выборе по одному полю в каждом списке эта кнопка будет иметь надпись Associate.

Рис. 1.11. ERD-диаграмма с отображением отношения между таблицами tblCustomer и tbIOrder
После создания таблицы в схеме базы данных можно использовать программу Visio для создания таблицы в базе данных. Для этого нужно выбрать команду меню Database→Update (База данных→Обновить). На экране появится диалоговое окно программы-мастера Database Update Wizard с предложением выполнить обновление. Для обновления базы данных можно создать сценарий на языке определения данных (Data Definition Language — DDL), который внесет все необходимые изменения в базу данных. Этот способ позволяет задокументировать все вносимые изменения и использовать их для репликации. (Более подробно DDL рассматривается в главе 2, «Запросы и команды на языке SQL».) Для обновления базы данных программа Visio может просто внести их в базу данных без создания сценария на DDL. Программа-мастер Database Update Wizard позволяет использовать любой из этих вариантов либо оба вместе.
Часто создание графической модели позволяет обнаружить недостатки схемы базы данных. Например, созданная ранее схема позволяет сохранять информацию о клиентах и заказах, но заказы состоят из товаров, взятых со склада компании и проданных клиенту. Однако в данной схеме базы данных не предусмотрена возможность просмотра товаров, заказанных клиентом.
Для решения этой проблемы нужно создать таблицу для хранения сведений о товарах заказа, которая имеет приведенную ниже структуру.
| tblOrderItem |
|---|
| ID |
| OrderID |
| ItemID |
| Quantity |
| Cost |
Теперь между таблицами tblOrder и tblOrderItem существует отношение типа один-ко-многим, как показано на рис. 1.12.
Полностью схему всей базы данных Novelty можно скопировать в виде файла для программы Visio с Web-страницы этой книги на Web-сервере Издательского дома «Вильяме» по адресу: www.williamspublishng.com.
НА ЗАМЕТКУ
Не следует путать процесс создания схемы базы данных с процессом создания программного обеспечения. В большинстве компаний по созданию программного обеспечения используется методология, которая регламентирует решаемые бизнес-задачи, внешний вид программного обеспечения и способ его создания. Их нужно учитывать при разработке базы данных.
Отношения
Отношение — это способ формального определения того, как две таблицы связаны друг с другом. При определении отношения необходимо сообщить процессору баз данных, через какие два поля связываются две таблицы, участвующие в создании отношения.

РИС. 1.12. Схема базы данных с отношениями между четырьмя таблицами
Полями, создающими отношение, являются первичный ключ (представленный выше в этой главе) и внешний (foreign) ключ. Внешний ключ — это ключ в связанной таблице, который хранит копию первичного ключа из основной таблицы.
Предположим, у вас есть таблицы с характеристиками отделов и сотрудников компании. Отношение между отделом и группой сотрудников можно определить типом один-ко-многим. Каждому отделу присваивается собственный идентификационный номер (ID), и каждый сотрудник имеет свой ID. Но, чтобы указать, в каком отделе работает каждый сотрудник, необходимо сделать копию номера ID отдела в каждой записи, содержащей данные о сотруднике. Итак, чтобы идентифицировать каждого сотрудника как члена некоторого отдела, в таблице Employees (Сотрудники) должно быть предусмотрено поле (именуемое, допустим, Department ID) для хранения ID отдела, в котором работает данный сотрудник. Поле Department ID в таблице Employees служит внешним ключом таблицы Employees, поскольку хранит копию первичного ключа таблицы Departments (Отделы).
Благодаря отношению процессор баз данных «знает», какие две таблицы участвуют в этом отношении и какой внешний ключ связан с первичным ключом. Для прежнего процессора Jet базы данных Access явное объявление отношений не обязательно, но это в ваших же интересах, поскольку при таком объявлении упрощается задача выборки данных из записей двух или нескольких связанных таблиц (подробнее об этом в главе 2, «Запросы и команды на языке SQL»). Отсутствие такого объявления – один из основных недостатков технологии Jet, который можно устранить с помощью переноса унаследованных приложений на основе технологии Jet на платформу ADO.NET. Помимо соответствия связанных записей в отдельных таблицах, отношение определяется для того, чтобы воспользоваться преимуществами ссылочной целостности, под которой понимают свойство процессора базы данных, обеспечивающее непротиворечивость информации, хранимой в многотабличной базе данных. Когда ссылочная целостность имеет место в базе данных, то процессор баз данных препятствует удалению записи в случае, если в базе данных существуют другие записи, связанные с ней.
После того как вы определите отношение в базе данных, это определение сохраняется до тех пор, пока вы не удалите его. Отношения можно создавать графически, используя инструменты Visual Studio .NET, SQL Enterprise Manager, Visio, или с помощью сценариев на языке DDL.
Использование ссылочной целостности для поддержания непротиворечивости данных
Когда таблицы связаны между собой посредством отношений, данные в каждой из связанных таблиц должны оставаться согласованными друг с другом. Ссылочная целостность справляется с этой задачей, отслеживая отношения между таблицами и запрещая выполнение определенных типов операций над записями.
Допустим, у вас есть таблицы tblCustomer и tblOrder. Эти две таблицы связаны через общее поле ID.
Предполагается, что сначала вы регистрируете клиентов в таблице tblCustomer, а затем создаете записи с информацией о заказах в таблице tblOrder. Но что произойдет, если запустить процесс, удаляющий запись с данными о клиенте, который оформил заказы, зарегистрированные в таблице tblOrder? А если создать заказ, для которого не существует действительного значения поля CustomerID? Любой заказ без значения поля CustomerID не будет отгружен, поскольку адрес отгрузки представляет собой функцию от записи в таблице tblCustomer. Когда данные в связанных таблицах страдают от такого рода проблемы, их называют несогласованными или противоречивыми.
Поскольку очень важно, чтобы база данных не стала противоречивой, во многих процессорах баз данных (включая SQL Server) предусмотрен способ определения формальных отношений между таблицами. При формальном определении отношения между двумя таблицами процессор баз данных отслеживает это отношение и препятствует выполнению любой операции, которая «покушается» на ссылочную целостность.
Ссылочная целостность обеспечивается путем генерирования ошибок при выполнении действия, которое могло бы оставить данные в противоречивом состоянии. Например, в базе данных с активизированной ссылочной целостностью при попытке создать заказ, содержащий идентификационный номер (ID) клиента, которого на самом деле не существует, вы получите сообщение об ошибке и «подозрительный» заказ не будет создан.
Проверка ограничений ссылочной целостности с помощью Server Explorer
Для проверки отношения между таблицами tblCustomer и tblOrder попробуем использовать окно Server Explorer среды Visual Studio .NET. Для этого выполните перечисленные ниже действия.
1. Откройте схему базы данных Novelty с двумя таблицами- tblCustomer и tblOrder. Обратите внимание на то, что эта схема содержит и другие таблицы, но в данном случае нас интересует отношение между этими таблицами.
2. Щелкните правой кнопкой мыши на линии отношения между двумя этими таблицами и из контекстного меню выберите команду Property Pages.
3. После появления на экране страницы свойств данного отношения выберите вкладку Relationships, в которой указаны поле ID таблицы tblCustomer, поле CustomerID таблицы tblOrder и ограничения ссылочной целостности в нижней части.
НА ЗАМЕТКУ
По умолчанию при создании отношения задаются ограничения ссылочной целостности (например, нельзя создать заказ для несуществующего клиента), но не заданы условия каскадного удаления. Более подробно эти условия рассматриваются далее.
4. Установите флажок Enforce Relationship for INSERTS and UPDATES (Применять каскадное обновление и удаление), а затем щелкните на кнопке Close.
5. Для сохранения внесенных изменений выберите команду File→Save Relationships.
Для проверки заданного ограничения выполните перечисленные ниже действия.
1. В окне Server Explorer щелкните правой кнопкой мыши на таблице tblOrder и выберите из контекстного меню команду Retrieve Data from Table.
2. Введите заказ для клиента идентификатором которого на самом деле нет в таблице с данными о клиентах.
3. Перейдите в другую строку для автоматического сохранения введенного заказа.
В результате на экране появится диалоговое окно с предупреждением: INSERT statement conflicted with COLUMN FOREIGN KEY constraint ‘ FK_tblOrder_tblCustomer’. Conflict occurred in database ‘Novelty’, table ‘tblCustomer’, column ‘ID’. The statement has been terminated. (Команда INSERT конфликтует с ОГРАНИЧЕНИЕМ ПО ВНЕШНЕМУ КЛЮЧУ ‘FK_tblOrder_tblCustomer’. Конфликт произошел в базе данных ‘Novelty’, таблице ‘tblCustomer’, поле ‘ID’. Выполнение команды прекращено.)
4. Щелкните на кнопке OK в окне с предупреждением и отмените команду вставки новой записи с помощью клавиши .
В данном случае наша цель заключалась не во вводе нового заказа, а в демонстрации сообщения об ошибке. Однако если вам действительно нужно создать заказ, то в таком случае следует создать запись для клиента, получить его идентификатор ID и использовать его в поле CustomerID при создании заказа.
В рабочем приложении эта проблема обычно решается автоматически с помощью специально созданного пользовательского интерфейса. Далее в книге рассматривается несколько стратегий согласованного управления связанными данными.
Каскадные обновления и каскадные удаления
Каскадные обновления и каскадные удаления – весьма полезные свойства процессора баз данных SQL Server. И вот почему.
• Каскадные обновления. При изменении значения первичного ключа таблицы связанные данные во внешних ключах, относящихся к этой таблице, также изменяются, отражая изменения в первичном ключе. Следовательно, если вы измените идентификатор ID клиента Хокки Марта (Hockey Mart) в таблице tblCustomer с 48 на 72, то значение поля CustomerID всех заказов, сгенерированных этим Хокки Мартом в таблице tblOrder, автоматически изменится с 48 на 72. В рабочем приложении редко приходится изменять значения ключа (основная концепция заключается в том, что ключ должен быть уникальным и неизменным), но если это все-таки приходится делать, то все каскадные обновления этого ключа во внешних ключах будут выполнены автоматически.
• Каскадные удаления. При удалении записи в таблице все записи, связанные с этой записью в соответствующих таблицах, автоматически удаляются. Следовательно, если вы удалите запись для Хокки Марта в таблице tblCustomer, все записи в таблице tblOrder для клиента Хокки Марта автоматически удаляются.
НА ЗАМЕТКУ
Устанавливая отношения, выполняющие каскадные обновления и удаления в базе данных, следует проявлять определенную осторожность. При недостаточной бдительности можно допустить удаление (или обновление) большего объема данных, чем ожидалось. Некоторые разработчики базы данных вообще отказываются от каскадного обновления и удаления, предпочитая явное управление ссылочной целостностью данных среди связанных таблиц. Однако, более внимательно изучив особенности каскадного обновления и удаления, можно убедиться в том, что они довольно легко программируются.
Каскадные обновления и удаления работают только в том случае, если вы установили отношение между двумя таблицами. Если вы всегда создаете таблицы с первичным ключом типа AutoNumber (Счетчик), (или первичными ключами типа AutoIncrement в терминах SQL Server), то каскадные удаления для вас окажутся более полезными, чем каскадные обновления, поскольку вы не в силах изменить значение поля типа AutoNumber или поля AutoIncrement (т.е. нет обновлений – нечего и тиражировать).
Для проверки возможностей каскадного удаления с помощью окна Server Explorer выполните перечисленные ниже действия.
1. Убедитесь в том, что между таблицами tblCustomer и tblOrder задано отношение с каскадным удалением. (Для проверки или указания этого ограничения воспользуйтесь схемой базы данных.)
2. Создайте запись о новом клиенте, щелкнув правой кнопкой мыши на таблице tblCustomer узла Tables в окне Server Explorer, выбрав в контекстном меню команду Retrieve Data from Table и введя необходимые данные. Запомните идентификатор ID, присвоенный процессором базы данных новому клиенту, потому что он потребуется для создания заказов данного клиента. Пусть эта таблица остается открытой, потому что она нам еще понадобится чуть позже.
3. Откройте таблицу tblOrder и создайте 2-3 заказа для нового клиента. Для этого укажите в поле CustomerID идентификатор ID, присвоенный процессором базы данных новому клиенту. Пусть эта таблица также остается открытой.
4. Вернитесь к таблице tblCustomer и попытайтесь удалить запись с данными этого клиента, щелкнув правой кнопкой мыши на левом конце записи и выбрав из контекстного меню команду Delete.
5. После этого на экране появится диалоговое окно с предупреждением и просьбой подтвердить удаление данных. Щелкните на кнопке Yes.
6. Вернитесь к таблице tblOrder, и вы обнаружите, что заказы этого клиента не удалены. Что произошло? На самом деле они удалены, но дают устаревшее представление данных. Для его обновления нужно выбрать команду меню Query→Run (Запрос1→Запуск). После этого вид таблицы будет обновлен и связанные заказы данного клиента будут удалены благодаря параметрам каскадного удаления.
Нормализация
Нормализация — это тесно связанное с отношениями понятие, которое означает устранение противоречий и повышение эффективности базы данных.
Базы данных считаются противоречивыми, если данные одной таблицы не соответствуют данным другой. Например, если ряд ваших сотрудников считают, что Арканзас находится на западе, а остальные — что на юге, при этом те и другие выполняют ввод данных, опираясь только на свои знания, то отчеты о состоянии дел на западе будут недостоверными.
Неэффективная база, данных, как правило, не позволяет выделять именно те данные, которые вам требуются. Если база данных хранит всю информацию в одной таблице, вы можете просто потерять самообладание, пока найдете в ней нужный телефонный номер. С другой стороны, полностью нормализованная база данных хранит каждую частицу информации в отдельной таблице и уникальным образом идентифицирует ее собственным первичным ключом. Нормализованные базы данных позволяют ссылаться на любую частицу информации в любой таблице, используя первичный ключ.
При проектировании и инициализации базы данных нужно решить, как ее нормализовать. Обычно все, что связано с приложением базы данных (от структуры таблиц до структуры запросов, от пользовательского интерфейса до поведения отчетов), вытекает из характера нормализации вашей базы данных.
НА ЗАМЕТКУ
Как разработчику баз данных, вам еще придется столкнуться с базами данных, которые не нормализованы по той или иной причине. Недостаток нормализации может намеренным (например, для достижения более высокой производительности) или оказаться результатом неопытности либо небрежности разработчика базы данных. В любом случае, если вы собираетесь нормализовать существующую базу данных, вам нужно сделать это как можно раньше (поскольку все остальное в разработке базы данных зависит от структуры ее таблиц). Кроме того, для приведения в порядок базы данных с недостаточно продуманной структурой можно использовать команды языка определения данных. Они позволяют переносить Данные из одной таблицы в другую, а также добавлять, обновлять и удалять из таблиц записи, отвечающие заданному критерию.
В качестве примера выбора варианта нормализации можно создать проект базы данных и рассмотреть требование, выдвинутое Брэдом Джонсом в бизнес-ситуации 1.2. Ему требуется способ хранения названия штата, в котором проживает клиент, а также информации о регионе страны, к которому относится этот штат. Начинающий разработчик может создать одно поле для хранения названия штата, а второе — для названия региона страны.
| tblCustomer |
|---|
| ID |
| FirstName |
| LastName |
| Address |
| Company |
| City |
| State |
| PostalCode |
| Phone |
| Fax |
| Region |
Эта структура первоначально может показаться рациональной, однако посмотрим, что произойдет, если кто-нибудь постарается ввести данные в приложение, основанное на этой таблице.
Если бы вы вводили обычную информацию о клиенте — имя, адрес и т.д., то после ввода названия штата вам бы пришлось задуматься, чтобы определить регион проживания данного клиента. Где же находится этот Арканзас – на западе или на юге? Где находится клиент с Виргинских островов? Если существует большая вероятность ошибки, то такого рода решения не стоит оставлять в руках операторов, занимающихся вводом данных, даже несмотря на их высокую квалификацию. Если же полагаться только на человеческую память, то рано или поздно ваши данные станут противоречивыми. А чтобы защитить данные от противоречивости, и следует обращаться к нормализации.
Вместо того чтобы при регистрации каждого нового клиента возлагать процесс принятия решения на операторов ввода, лучше хранить информацию, связанную с регионами, в отдельной таблице. Эту таблицу можно было бы назвать tblRegion; структура ее совсем проста.
| tblRegion |
|---|
| ID |
| State |
| Region |
Данные в этой таблице выглядели бы следующим образом:
| State | Region |
|---|---|
| AK | Север |
| AL | Юг |
| AR | Юг |
| AZ | Запад |
| . | . |
В этой усовершенствованной версии структуры базы данных для выборки информации о регионе вам придется выполнить двухтабличный запрос с объединением двух таблиц – tblCustomer и tblRegion, причем из одной таблицы вы получите информацию о штате, а из другой – о регионе (на основании информации о штате). В объединениях сопоставляются записи, имеющие общие поля, в отдельных таблицах. (Более подробно объединения описываются в главе 2, «Запросы и команды на языке SQL».) Хранение информации о регионах в отдельной таблице имеет ряд преимуществ.
• Если вы решили выделить новый регион на основе существующего, то для отражения рождения нового региона проще изменить всего несколько записей в таблице tblRegion, чем тысячи записей в таблице tblCustomer.
• Если вы расширите свой бизнес за пределы 50 штатов, то для отражения изменений в бизнесе достаточно опять-таки добавить новый регион. Для этого вам понадобится внести в таблицу tblRegion всего по одной записи для каждой новой области, и эта новая запись немедленно станет доступной для всей системы.
• Если обнаружится необходимость использования принципов регионального деления в других задачах, решаемых на основе этой базы данных (например, для обозначения того, что офис по продажам, расположенный в определенном штате, обслуживает определенный регион), то вы могли бы с успехом использовать таблицу tblRegion без модификаций.
Отсюда вытекает, что для отдельных категорий информации следует всегда ориентироваться на создание отдельных таблиц. Во время разработки структуры базы данных (еще до реального построения самой базы данных) необходимо хорошо продумать, какие таблицы вам нужны и как они будут связаны друг с другом. Создание схемы базы данных (см. раздел о создании схемы базы данных выше в этой главе) является частью этого важного процесса.
Отношения типа один-к-одному
Предположим, в вашей базе данных есть таблицы, в которых хранится информация о сотрудниках и видах работ. Если каждому служащему назначается один вид работы, то отношение между сотрудниками и видами работ можно определить типом один-к-одному, поскольку для каждого сотрудника в базе данных существует только один вид работы. Это простейший тип отношений как для понимания, так и для реализации, поскольку в таких отношениях таблица обычно занимает место поля в другой таблице, причем поля, участвующие в отношении, легко идентифицировать.
Однако это не самый распространенный тип отношений в функционирующих приложениях ведения баз данных. Тому есть две причины.
Почти всегда можно выразить отношение типа один-к-одному без использования двух таблиц. При этом быстродействие только повысится, хотя будет утрачена гибкость, предоставляемая хранением связанных данных в отдельной таблице. В предыдущем примере вместо создания отдельной таблицы с данными о видах работ можно поместить все поля, связанные с работой, в таблицу, предназначенную для хранения данных о сотрудниках.
Выражение отношения один-ко-многим почти такое же простое для понимания (но гораздо более гибкое), как выражение отношения один-к-одному, поэтому сразу же переходим к следующему разделу.
Отношения типа один-ко-многим
Гораздо чаще, чем отношения типа один-к-одному, в базах данных используются отношения типа один-ко-многим, в которых каждая запись таблицы связана с одной или несколькими записями в другой таблице (или вообще не связана ни с какими записями). В созданной ранее схеме базы данных между клиентами и заказами задано отношение один-ко-многим. Каждый клиент может иметь один или несколько заказов (или вообще не иметь заказов), поэтому между таблицами tblCustomers и tblOrder существует отношение один-ко-многим.
Напомним, что для реализации такого отношения в базе данных копируется первичный ключ из таблицы на стороне «один» в таблицу на стороне «многие». В пользовательском интерфейсе для ввода данных этот тип отношения обычно имеет вид формы с основной (master) и подчиненной (slave) частями, в которой одна основная запись отображается со своими подчиненными записями в отдельной части формы. В пользовательском интерфейсе первичный ключ из одной таблицы обычно связывает ся с внешним ключом из связанной таблицы с помощью списка или поля со списком.
Отношения типа многие-ко-многим
Отношение типа многие-ко-многим по сравнению с отношением один-ко-многим идет еще дальше. В качестве классического примера отношения типа многие-ко-многим можно привести отношение между студентами и классами. Каждый студент может иметь много классов, а каждый класс – много студентов. (Конечно же, возможны варианты, когда класс будет состоять из одного студента или в нем вовсе не будет ни одного учащегося, а также вполне возможно для студента иметь только один класс или ни одного.)
В данном бизнес-примере отношение задается между заказами и позициями заказа, т.е. каждый заказ может содержать несколько позиций, а каждая позиция может присутствовать в нескольких заказах.
Чтобы установить отношение многие-ко-многим, необходимо иметь три таблицы: две для хранения реальных данных и третью (именуемую соединительной) для хранения отношения между двумя первыми таблицами. Таблица соединения обычно состоит только из двух внешних ключей – по одному из каждой связанной таблицы, хотя иногда в таблице соединения полезно использовать собственное поле с идентификаторами для предоставления доступа к записям таблицы с помощью программных средств.
В качестве примера отношения многие-ко-многим можно модифицировать пример из предыдущего раздела таким образом, чтобы в базе данных хранилось несколько позиций, связанных с одним заказом, т.е. у каждого заказа было много позиций и каждая позиция относилась к неограниченному количеству заказов. В этом случае таблицы могут выглядеть так, как показано на рис. 1.13.

РИС. 1.13. В этой группе таблиц, участвующих в отношении многие-ко-многим, tbIOrderItem является таблицей соединения
Создание пользовательского интерфейса на основе Windows Forms
Разработчики предыдущих версий Visual Basic первыми предложили концепцию связывания данных, согласно которой связанный с данными объект или элемент управления данными (data control) позволяет программистам с минимальными усилиями создавать простые, связанные с данными пользовательские интерфейсы. В Visual Basic .NET эта концепция также поддерживается, а многие недостатки прежней версии устранены.
В прошлом разработчик мог установить связь между формой Visual Basic и базой данных с помощью элементов управления данными. Они предоставляют основные функции просмотра данных, позволяя приложению манипулировать наборами данных, вводить и обновлять их.
На платформе .NET операциями подключения к базе данных и извлечения данных управляет автоматически созданный код, что позволяет добиться ряда преимуществ.
1. Автоматически созданный код, в отличие от абстрактного элемента управления данными, можно просматривать, поэтому он позволяет в большей степени контролировать способы доступа к данным.
2. Изучая автоматически созданный код, программист может познакомиться с классами платформы .NET, предназначенными для доступа к данным, что особенно полезно для тех, кто не имеет опыта работы на платформе .NET.
3. Основное назначение элементов управления данными в прежней версии Visual Basic это подключение к базе данных, создание запроса к ней и управление данными. Теперь эти функции распределены между несколькими объектами, каждый из которых можно отдельно конфигурировать и использовать.
В приведенных ранее примерах создана база данных, которая вполне подходит для ознакомления с основными принципами создания связанного с данными пользовательского интерфейса. В следующих разделах демонстрируются способы создания связанных с базой данных приложений на основе Windows Forms.
Подключение к базе данных и работа с записями
Нет ничего проще, чем создать приложение на основе Windows Forms. И в этом заявлении нет никакого преувеличения; более того, если вас интересует лишь просмотр содержимого базы данных, вам вообще не придется писать ни единой строки кода. Весь процесс состоит из двух этапов: подключение к базе данных и связывание последнего пользовательского интерфейса с источником данных, генерированным Visual Studio .NET. Для этого выполните перечисленные ниже действия.
1. В Visual Studio .NET создайте новый проект на основе Windows Forms и откройте новую форму Form1.
2. В окне Server Explorer найдите созданную ранее таблицу tblCustomer и перетащите ее из окна Server Explorer в форму Form1.
3. После этого в нижней части окна с формой Form1 появятся объекты SqlConnection1 и SqlDataAdapter1.
Для извлечения и отображения данных используются три объекта: объект SqlConnection1 создает подключение к базе данных, объект-адаптер SqlDataAdapter1 извлекает данные, а объект DataSet сохраняет данные, извлеченные адаптером SqlDataAdapter1. Для создания объекта DataSet выполните следующее.
1. Выберите команду меню Data→Generate Dataset (Данные1→Генерация набора данных), и на экране появится диалоговое окно Generate Dataset.
2. Воспользуйтесь всеми заданными по умолчанию параметрами и щелкните на кнопке OK. В результате будет создан новый объект DataSet11, который будет располагаться в нижней части окна под формой Form1 возле объектов SqlConnection1 иSqlDataAdapter1.
Для просмотра данных в форме создайте в форме элемент управления пользовательского интерфейса и свяжите его с только что созданным объектом DataSet11, выполнив перечисленные ниже действия.
1. Откройте панель элементов управления Toolbox с помощью команды меню View→Toolbox (Просмотр→Панель инструментов управления), перейдите во вкладку Windows Forms и найдите элемент управления DataGrid (Сетка данных). Перетащите его в форму Form1, и в ней появится экземпляр DataGrid1 объекта DataGrid.
2. Свяжите этот элемент управления с источником данных. Для этого с помощью команды меню View→Properties Window (Просмотр1→Окно свойств) откройте окно свойств Properties и выберите для свойства DataSource (Источник данных) сетки DataGrid1 источник данных DataSet11. Затем выберите для свойства DataMember (Элемент данных) сетки DataGrid1 таблицу tblCustomer.
3. Наконец, создайте код извлечения данных из базы данных и вставки их в сетку DataGrid1. Для этого дважды щелкните на форме, и в окне просмотра кода автоматически появится процедура Form1_Load. Введите в ней следующий код:
Private Sub Form1_Load(ByVal sender As System.Object , _
ByVal e As System.EventArgs) Handles MyBase.Load
SqlDataAdapter1.Fill(DataSet11)
End Sub
4. Запустите полученное приложение с помощью команды меню Debug→Start (Отладка→Запуск), и в окне приложения будут отображены данные из таблицы tblCustomer.
Здесь следует отметить одну особенность данного приложения. Все внесенные в нем изменения данных не будут отражены и сохранены в базе данных. Для их сохранения нужно создать дополнительный код вызова метода объекта DataAdapter. Эта тема рассматривается далее, в разделе об обновлении записей.
Создание приложения для просмотра данных
В предыдущем примере показан простейший способ связывания данных на основе извлечения всей таблицы и отображения ее в элементе управления DataGrid. А как отобразить только одну запись? Для этого потребуется использовать элементы управления TextBox и Button, а также создать дополнительный код.
Чтобы создать приложение для просмотра данных по одной записи из таблицы tblCustomer, выполните ряд действий.
1. В Visual Studio .NET создайте новый проект на основе Windows Forms и откройте новую форму Form1. Создайте в ней два текстовых поля, txtFirstName и txtLastName, на основе элемента управления TextBox.
2. Создайте объекты SqlConnection, SqlDataAdapter и DataSet для извлечения данных о клиентах из таблицы tblCustomer. (Необходимые для этого действия аналогичны действиям из предыдущего примера.) Как и прежде, не забудьте вызвать метод Fill объекта SqlDataAdapter в коде для инициализации объекта DataSet. (В данном примере объект DataSet имеет имя DsCustomer1. — Прим. ред.)
3. Теперь нужно создать связь между двумя текстовыми полями (txtFirstName и txtLastName) и соответствующими полями в базе данных. Для этого щелкните на текстовом поле txtFirstName и в группе свойств Data выберите подгруппу свойств (DataBindings). Это свойство содержит несколько свойств, которые следует установить для связывания данных таблицы с текстовым полем.
4. Выберите поле FirstName таблицы tblCustomer для свойства Text текстового поля txtFirstName. Для этого щелкните в правой части поля со списком возле свойства Text. Выберите набор данных DsCustomer1, таблицу tblCustomer и поле FirstName, как показано на рис. 1.14.

РИС. 1.14. Создание связи между данными из поля базы, данных и текстовым полем с помощью свойств (DataBindings)
5. Аналогично свяжите текстовое поле txtLastName с полем LastName таблицы tblCustomer.
6. Запустите приложение, в текстовых полях которого будут отображены имя и фамилия первого клиента.
Возможности этого приложения весьма ограниченны, потому что в нем можно просматривать только по одной записи и нельзя редактировать данные. Однако оно является базовым приложением, на основе которого будут созданы несколько других примеров с более широкими возможностями рабочего приложения для полномасштабной работы с базами данных.
Даже в таком ограниченном примере очевидны преимущества способов связывания данных на платформе .NET: они более гибки, чем аналогичные способы в Visual Basic 6. Например, упомянутая гибкость достигается за счет способности управлять процессом связывания с помощью кода.
Попробуем теперь создать код для перехода от одной записи к другой с помощью перечисленных ниже действий.
1. Создайте две кнопки, btnNext и btnPrevious, для перехода к следующей и предыдущей записям.
2. Дважды щелкните на кнопке btnNext и в автоматически появившемся окне редактирования кода с определением процедуры btnNext_Click вставьте следующий код:
Private Sub btnNext_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNext.Click
Me.BindingContext(DsCustomer1, "tblCustomer").Position += 1
End Sub
3. Дважды щелкните на кнопке btnPrevious и в автоматически появившемся окне редактирования кода с определением процедуры btnPrevious_Click вставьте код
Private Sub btnPrevious_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnPrevious.Click
Me.BindingContext(DsCustomer1, "tblCustomer").Position -= 1
End Sub
4. Снова запустите приложение и убедитесь в том, что с помощью созданных кнопок можно переходить к следующей и предыдущей записям. (Учтите, что эта программа будет работать только при наличии нескольких записей в таблице.)
Объект BindingContext предоставляет средства организации перехода к другим записям в приложении для работы с данными. При создании таких приложений в предыдущих версиях Visual Basic для организации переходов к другим записям требовалось использовать элемент управления Data. На платформе .NET выделен, специальный объект BindingContext, который отвечает за связывание данных. (Иными словами, выделение небольшого специализированного объекта из более крупного общего объекта позволяет распределить специализированные функции среди нескольких объектов меньшего размера.) В объектно-ориентированном программировании разработчик стремится создавать специализированные объекты, чтобы упростить структуру программы и сделать ее более гибкой.
Таким образом, при создании приложения, рассчитанного на работу с базами данных, для составления запросов, обновления данных, связывания элементов управления пользовательского интерфейса с данными и перехода к полям таблицы не рекомендуется использовать один громоздкий объект Data. Вместо него в Windows Forms и ADO.NET предусмотрено несколько отдельных специализированных объектов. Выделение функций доступа к данным – ключевое достоинство платформы .NET Framework (этот вопрос подробно рассматривается в следующих главах).
Объект BindingContext является членом семейства объектов Windows Forms (а точнее, членом пространства имен System.Windows.Forms платформы .NET Framework) и содержит множество полезных свойств и методов. Например, объект BindingContext можно использовать для определения количества записей в источнике данных так, как описано ниже.
1. Создайте ярлык lblDataStatus с помощью элемента управления Label с пустой строкой в свойстве Text.
2. В коде формы создайте подпрограмму ShowDataStatus с указанным ниже кодом, которая будет отображать текущее расположение записи и общее количество записей в ярлыке lblDataStatus.
Private Sub ShowDataStatus()
With Me.bindingContext(DsCustomer1, "tblCustomer")
lblDataStatus. Text = "Record " + s.Position + 1 & " of " & .Count
End With
End Sub
3. Поместите вызов этой подпрограммы ShowDataStatus в подпрограммы обработки событий загрузки формы (Forml_Load) и щелчков мыши на обеих кнопках (btnNext_Click и btnPrevious_Click). Это позволит отображать обновленную информацию о текущем количестве записей и текущей записи при загрузке формы и после каждого перемещения к другой записи. Учтите, что отсчет текущего номера записи (свойство Position объекта DataBindings) начинается с нуля (как и во всех коллекциях на платформе.NET). Поэтому для получения реального номера записи следует прибавить к нему 1.
4. Запустите приложение и попробуйте перейти к разным записям таблицы. Тогда в ярлыке будет отображено общее количество записей в таблице и номер текущей записи.
Программный способ связывания данных
С помощью Windows Forms связывание данных можно организовать программно. Это позволяет добиться более высокой гибкости в ситуациях, когда расположение полей неизвестно во время создания приложения либо требуется явно выразить связь между элементами управления и полями другим способом, чем предлагается в интегрированной среде разработки.
Чтобы организовать связь с элементами управления пользовательского интерфейса, следует создать метод Add объекта DataBindings элемента управления Windows Forms. В листинге 1.1 показан типичный способ создания связи с данными в приложении для работы с базами данных.
Листинг 1.1. Программный способ очистки и установления связи сданными
Private Sub Form1_Load (ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
txtFirstName.DataBindings.Clear()
txtLastName.DataBindings.Clear()
txtFirstName.DataBindings.Add("Text", DsCustomer1, "tblCustomer.LastName")
txtLastName.DataBindings.Add("Text", DsCustomer1, "tblCustomer.LastName")
sqlAdapterl.Fill(DsCustomer1)
ShowDataStatus()
End Sub
(Убедитесь в том, что для свойства ConnectionString объекта SqlConnection1 задана верная строка подключения с используемым вами сервером SQL Server. Дело в том, что в коде этого примера, который можно скопировать по адресу: http://www.williamspublishing.com указана строка подключения к серверу SQL Server, установленному на компьютере ROCKO автора книги. – Прим. ред.)
Обратите внимание, что вызовы метода Clear элементов управления коллекции DataBindings не обязательно создавать в разрабатываемом приложении. Они нужны в этом случае, потому что связь с данными ранее задана с помощью окна Properties.
Метод Add коллекции DataBindings принимает три параметра: свойство элемента управления, с которым связываются данные; объект источника данных (обычно, но не обязательно объект DataSet), ссылка на член источника данных, который предоставляет данные. После запуска приложения с приведенным выше кодом для метода Load в поле с именем клиента будет отображена его фамилия, а в поле с фамилией – его имя.
Элементы управления, взаимодействующие с данными
Элементом управления, взаимодействующим с данными (data-aware control), может быть любой элемент управления, имеющий свойство-коллекцию DataBindings. С помощью этого свойства можно ссылаться на любой тип данных, включая реляционные источник данных.
Свойство DataBindings соединяет элемент управления пользовательского интерфейса с элементом управления данными (т.е. именно так происходит связывание пользовательского интерфейса с базой данных). Поэтому говорят, что элемент управления пользовательского интерфейса связан с базой данных через элемент управления данными.
В предыдущих версиях Visual Basic с источником данных можно было связать относительно небольшое количество элементов управления пользовательского интерфейса. Возможности манипулирования связанными с данными элементами управления были довольно ограниченными: пользователь мог связать их с теми источниками данных, для которых существует провайдер данных ADO. Для взаимодействующих с данными элементов управления разработчику приходилось создавать рутинный код большого размера для выполнения вручную всех операций связывания данных. На платформе.NET практически каждый элемент управления Windows Forms может быть связан с данными, включая сложные элементы управления, например Tree View. Более того, разработчик не ограничен только реляционными источниками данных или известными среде Visual Studio .NET или ADO.NET. Любой объект, реализующий интерфейс IList, может быть связан с данными, включая наборы данных DataSet и более сложные конструкции, например массивы и коллекции.
Обновление записей в приложении просмотра данных
До сих пор в приведенных ранее примерах нам удавалось только извлекать и просматривать данные. А изменять данные можно было только в элементах пользовательского интерфейса, но их нельзя было сохранить (зафиксировать) в базе данных.
Интуитивно понятно, что изменения в связанном с данными элементе управления пользовательского интерфейса должны автоматически сохраняться в базе данных. Именно так работают различные связанные с данными элементы управления пользовательского интерфейса в прежних версиях Visual Basic. Почему же в Windows Forms на платформе.NET связывание с данными организовано иначе?
Принудительная фиксация обновлений в источнике данных с помощью дополнительной строки кода продиктована требованиями гибкости и более высокой производительности. Рассмотрим принцип работы объекта DataSet на платформе .NET.
На рис. 1.15 показана схема взаимосвязи между формой, объектом DataSet и базой данных в приложении на основе Windows Forms.

РИС. 1.15. Схема взаимосвязи между связанной формой, объектом DataSet и базой данных
В созданном ранее приложении все данные в исходном состоянии находятся в базе данных. Затем они извлекаются и сохраняются в памяти в объекте DataSet. Форма содержит элементы управления, связанные с полями таблицы в объекте DataSet. Форма обнаруживает появление новых данных и автоматически отображает содержимое полей в связанных с данными элементах управления.
В связанном с данными приложении изменение содержимого связанного с данными элемента управления влияет только на объект DataSet, т.е. изменение содержимого текстового поля приводит к изменению содержимого записи в таблице, которая находится в объекте DataSet. Но изменение объекта DataSet не копируется в базу данных, а сохраняется до тех пор, пока не поступит явное указание скопировать их в базу данных (с помощью метода Update набора данных DataSet). Хотя явное включение этой инструкции может показаться излишним (ведь в прежних версиях Visual Basic этого делать было не нужно), но на самом деле оно позволяет добиться более высокой производительности. Дело в том, что в таком случае приложению не нужно постоянно поддерживать соединение с базой данных во время редактирования данных пользователем.
В листинге 1.2 показан пример модифицированных обработчиков событий, которые позволяют редактировать данные в созданном ранее приложении.
Листинг 1.2. Сохранение данных с помощью явного обновления объекта DataSet при перемещении пользователя к другим записям
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bfnNext.Click
Me.BindingContext(DsCustomer1, "tbICustomer").Position += 1
SqlDataAdapter1.Update(DsCustomer1)
ShowDataStatus()
End Sub
Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevious.Click
Me.BindingContext(DsCustomerl, "tblCustomer").Position -= 1
SqlDataAdapter1.Update(DsCustomer1)
ShowDataStatus()
End Sub
Конечно, обновлять каждую запись при перемещении пользователя к другим записям совсем не обязательно. Поскольку разработчик может контролировать способ обновления объекта DataSet, можно было бы организовать обновление внесенных изменений с помощью специальной кнопки или команды меню Save. Можно также отложить фиксацию обновлений до окончания редактирования группы строк, т.е. использовать пакетное обновление. ВADO.NET для пакетного обновления не нужно создавать какой-либо иной специализированный код, потому что оно выполняется автоматически объектами DataSet (который сохраняет данные в памяти) и SqlDataAdapter (который отвечает за выполнение необходимых команд управления базой данных для гарантированного корректного представления, вставки, обновления и удаления данных). Более подробно связь между этими объектами описывается в главах 5, «ADO.NET: объект DataSet», и 6, «ADO.NET: объект DataAdapter».
Создание новых записей в форме, связанной с данными
Для создания новой записи в связанном с данными приложении на основе Windows Forms нужно использовать метод AddNew объекта BindingContext. При выполнении этого метода любые связанные с данными элементы управления очищаются для ввода новых данных. После ввода новых данных они фиксируются в базе данных с помощью метода Update объекта DataAdapter (как в предыдущем примере).
Для создания новых записей в связанном с данными приложении выполните перечисленные ниже действия.
1. Создайте в форме новую кнопку с именем btnNew и укажите значение New (Ввести новые данные) для ее свойства Text.
2. Щелкните дважды на кнопке и введите приведенный ниже код обработки события щелчка на этой кнопке.
Private Sub btnNew_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNew.Click
Me.BindingContext(DsCustomer1, "tblCustomer").AddNew()
txtFirstName.Focus()
ShowDataStatus()
End Sub
3. Запустите приложение и щелкните на кнопке New. После очистки текстового поля пользователь сможет ввести в форме новую запись. Для сохранения новой записи нужно перейти к другой записи с помощью кнопок Next или Previous.
Учтите, что кнопки Next или Previous фиксируют обновления объекта DataSet, поэтому в данном примере не нужно использовать явные инструкции обновления объекта DataSet после создания новой записи. В данном случае достаточно просто перейти к другой записи. Но если пользователь закроет приложение до фиксации новых данных в базе данных (либо неявно с помощью перехода к другой записи, либо явно с помощью метода Update объекта DataAdapter), то новые данные будут утрачены.
Кроме того, пользователю обычно предоставляют возможность отмены внесенных изменений с помощью метода CancelCurrentEdit объекта BindingContext.
Удаление записей из связанной с данными формы
Для удаления записей из связанной с данными формы на основе Windows Forms нужно использовать метод RemoveAt объекта BindingContext. Этот метод принимает один параметр – индекс удаляемой записи. Для организации удаления текущей записи нужно использовать свойство Position в качестве параметра метода RemoveAt объекта BindingContext, как показано в листинге 1.3.
Листинг 1.3. Удаление данных в приложении для работы с данными с помощью метода RemoveAt объекта BindingContext
Private Sub btnDelete_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnDelete.Click
If MsgBox("Whoa bubba, you sure?", MsgBoxStyle.YesNo, "Delete record") = MsgBoxResult.Yes Then
With Me.BindingContext(DsCustomer1, "tblCustomer")
RemoveAt(.Position)
End With
End If
End Sub
Этот код основан на созданной перед этим кнопке btnDelete. Учтите, что эта процедура запрашивает пользователей, действительно ли они хотят удалить запись. Этот запрос позволяет избежать неприятных последствий в случае, если пользовательский интерфейс создан так, что пользователь может случайно удалить запись, щелкая на кнопке Delete. (Обратите внимание, что, кроме этого способа на основе диалогового окна с предупреждением об удалении записи, можно применять более сложные методы отката ошибочных изменений данных. Однако описание таких сложных конструкций выходит за рамки данной главы.)
Учтите, что метод RemoveAt способен определять и обрабатывать стандартные исключительные ситуации, например при отсутствии данных или после очистки данных в элементе управления пользовательского интерфейса при вызове метода AddNew. Эта возможность позволяет значительно усовершенствовать методы контроля над связанными сданными элементами управления в прежних версиях Visual Basic, для которых требовалось создавать громоздкий код обработки исключительных ситуаций, возникающих при выполнении пользователями непредсказуемых действий.
Проверка введенных данных в форме, связанной с данными
В программировании баз данных проверка введенных данных (validation) гарантирует, что эти данные отвечают правилам, определенным при проектировании приложения. Эти правила называются правилами проверки данных (validation rules). Один из способов проверки данных при программировании приложения на основе Windows Forms состоит в написании кода для события RowUpdating объекта DataAdapter. Событие RowUpdating возникает как раз перед обновлением записи, а событие Row-Updated — сразу после обновления записи. Размещая код проверки введенных данных в событие RowUpdating, можно быть уверенным в том, что будут обрабатываться любые изменения данных в любой части приложения.
Ключевым фактором эффективного использования события RowUpdating является использование свойств и методов аргумента события, который представлен в виде экземпляра объекта System.Data.SqlClient.SqlClient.SqlRowUpdatingEventArgs.
Кроме проверки команды обновления записи (с помощью свойства Command объекта), можно проинформировать адаптер данных DataAdapter об отказе от обновления и откате внесенных изменений. В листинге 1.4 этот подход иллюстрирует рассмотренный ранее пример приложения для просмотра данных.
Листинг 1.4. Построчная проверка введенных данных с помощью события RowUpdating объекта DataAdapter
Private Sub SqlDataAdapter1_RowUpdating(ByVal sender As Object, _
ByVal e As System.Data.SqlClient.SqlRowUpdatingEventArgs) _
Handles SqlDataAdapter1.RowUpdating
If e.Row.Item("FirstName") = "" Or e.Row.Item("LastName") = "" Then
MsgBox("Change not saved; customer must have a first and last name.")
e.Status = UpdateStatus.SkipCurrentRow
e.Row.RejectChanges()
End If
End Sub
Передача значения UpdateStatus.SkipCurrentRow свойству Status аргумента события позволяет сообщить адаптеру данных о прекращении операции, т.е. отмене обновления данных, потому что оно не прошло проверку. Но недостаточно просто прекратить выполнение операции, потому что в этом случае пользователь получит пустое текстовое поле (и пустое поле в объекте DataSet). Для решения этой проблемы следует вызвать метод RejectChanges объекта Row, который содержится в аргументе события. Он обновит содержимое пользовательского интерфейса и сообщит объекту DataSet о том, что больше не нужно согласовывать эту строку с базой данных. После этого можно продолжать редактирование данных, не беспокоясь об их безопасности.
Проверка введенных данных на уровне процессора баз данных
Помимо проверки данных во время ввода информации, следует знать о том, что можно также выполнять проверку и на уровне процессора баз данных. Такая проверка обычно более надежна, поскольку применяется независимо от причины изменения данных. При этом вам не нужно заботиться о реализации правил проверки введенных данных в каждом приложении, которое получает доступ к какой-нибудь таблице. Однако проверка введенных данных на уровне процессора баз данных отличается меньшей гибкостью, поскольку его практически невозможно переопределить, и часто имеет примитивную форму (обычно ограничивается тем, что не допускает ввод в поля пустых значений). Кроме того, проверку введенных данных на уровне процессора баз данных можно выполнять только на уровне поля, и вы не сможете сделать так, чтобы правила проверки введенных данных, реализуемые процессором баз данных, были основаны на сравнении значений двух полей (если только проверка не реализована на основе ограничения первичный/внешний ключ или реализована в серверной процедуре в виде триггера).
Контроль на уровне процессора баз данных является функцией схемы базы данных. Предположим, вы хотите быть уверены в том, что ни одна запись о клиенте не будет введена в таблицу tblCustomer без указания его имени и фамилии. Тогда установите правило проверки введенных данных на уровне процессора баз данных, выполнив перечисленные ниже действия.
1. В окне Server Explorer среды Visual Studio .NET откройте схему таблицы tblCustomer.
2. В столбце Allow Nulls (Допускаются неопределенные значения) снимите флажки FirstName и LastName.
3. Сохраните схему таблицы tblCustomer с помощью команды меню File→Save tblCustomer.
Теперь никакое программное обеспечение, использующее эту базу данных, не сможет ввести запись о клиенте без указания его имени и фамилии. (Любая попытка приведет к возникновению исключительной ситуации.)
Резюме
Эта глава посвящена основам баз данных в целом, а также простейшим способам соединения приложений Visual Basic .NET для работы сданными, хранящимися в базе данных SQL Server. Следует учитывать, что правильно составленная схема базы данных может значительно повысить производительность и практичность приложения. Нормализация, ссылочная целостность и индексирование могут оказаться весьма эффективными для достижения этих целей. Однако помните, что чрезмерное индексирование может привести к обратному эффекту и замедлить работу приложения. В следующих главах приводятся примеры бизнес-ситуаций, в которых следует учитывать эти особенности.
Вопросы и ответы
Существует ли в Visual Studio .NET элемент управления Data, который в Visual Basic 6 можно было успешно использовать для быстрого создания прототипов данных?
Нет. Все функции элемента управления Data, который использовался в Visual Basic 6 и более старых версиях, теперь распределены среди разных объектов данных. Например, соединение с базой данных теперь создается с помощью отдельного объекта SqlConnection, операции извлечения, обновления и удаления данных — с помощью объектов BindingContext и DataAdapter, а операции перемещения по записям — с помощью объекта BindingContext. В отличие от прежних объектов для работы с данными, новые объекты не имеют никакого визуального представления во время выполнения, что позволяет разработчику создавать практически любые виды пользовательского интерфейса для работы с данными.
Можно ли первичный ключ составить из нескольких полей?
Да, хотя такие ключи встречаются нечасто. Они называются конкатенированными ключами. Например, если вы составляете конкатенированный первичный ключ из полей, содержащих имя и фамилию, то это значит, что в такой базе данных нельзя зарегистрировать полных «тезок», поскольку каждое сочетание имени и фамилии должно образовывать уникальное значение.
bookInfo->litres_url == «» —> < НазадДалее > bookInfo->litres_url == «» —>
ТЕЛЕГРАМ
Канал с обзорами, анонсами новинок и книжными подборками
Бот для удобного поиска книг (если не нашлось на сайте)
Свежие любовные романы в удобных форматах
О психологии, саморазвитии и личностном росте
Детективы и триллеры, все новинки
Фантастика и фэнтези, все новинки
Отборные классические книги

ВКОНТАКТЕ
Цитаты, афоризмы, стихи, книжные подборки, обсуждения и многое другое
БИБЛИОТЕКИ
Библиотека с любовными романами, которая наверняка придётся по вкусу женской части аудитории
Библиотека с фантастикой и фэнтези, а также смежных жанров
Самые популярные книги в формате фб2
Оглавление
- К описанию
- Предисловие
- Для кого предназначена эта книга
- Структура книги
- Используемое программное обеспечение
- Об авторах
- О соавторе
- О рецензентах
- Благодарности
- ГЛАВА 1 Основы построения баз данных
- Что представляет собой база данных
- Что такое платформа базы данных
- Бизнес-ситуации
- Бизнес-ситуация 1.1: основные сведения о компании Jones Novelties Incorporated
- Таблицы и поля
- Проектирование базы данных
- Бизнес-ситуация 1.2: проектирование таблиц и отношений
- Манипулирование данными с помощью объектов
- Типы данных
- Схема базы данных
- Использование инструментов Visual Studio для создания базы данных
- Определение индексов и первичного ключа
- Создание схемы базы данных
- Использование программы Microsoft Visio для просмотра и изменения схемы базы данных
- Отношения
- Использование ссылочной целостности для поддержания непротиворечивости данных
- Проверка ограничений ссылочной целостности с помощью Server Explorer
- Каскадные обновления и каскадные удаления
- Нормализация
- Отношения типа один-к-одному
- Отношения типа один-ко-многим
- Отношения типа многие-ко-многим
- Создание пользовательского интерфейса на основе Windows Forms
- Подключение к базе данных и работа с записями
- Создание приложения для просмотра данных
- Программный способ связывания данных
- Элементы управления, взаимодействующие с данными
- Обновление записей в приложении просмотра данных
- Создание новых записей в форме, связанной с данными
- Удаление записей из связанной с данными формы
- Проверка введенных данных в форме, связанной с данными
- Проверка введенных данных на уровне процессора баз данных
- Резюме
- Вопросы и ответы
- ГЛАВА 2 Запросы и команды на языке SQL
- Что такое запрос
- Тестирование запросов с помощью компонента Server Explorer
- Отбор записей с помощью предложения SELECT
- Указание источника записей с помощью предложения FROM
- Формирование критериев с использованием предложения WHERE
- Операторы, используемые в предложении WHERE
- Оператор BETWEEN
- Оператор LIKE и символы шаблона
- Оператор IN
- Сортировка результатов с помощью предложения ORDER BY
- Сортировка в убывающей последовательности
- Сортировка по нескольким полям
- Отображение первых или последних записей диапазона с помощью предложения ТОР
- Создание запросов TOP PERCENT
- Объединение связанных таблиц в запросе
- Выражение объединения в SQL
- Использование конструктора представлений для создания объединений
- Использование внешних объединений
- Выполнение вычислений в запросах
- Определение псевдонимов с использованием предложения AS
- Запросы, которые группируют данные и подводят итоги
- Применение предложения HAVING для группирования данных в запросах
- Функция SUM
- Перечень итоговых функций
- Запросы на объединение
- Подзапросы
- Манипулирование данными с помощью SQL
- Запросы на обновление
- Запросы на удаление
- Запрос на добавление записей
- Запросы на основе команды SELECT INTO
- Использование языка определения данных
- Создание элементов базы данных с помощью предложения CREATE
- Добавление ограничений в таблицу
- Назначение внешнего ключа
- Создание индексов с помощью команды CREATE INDEX
- Удаление таблиц и индексов с помощью предложения DROP
- Модификация структуры таблицы с помощью предложения ALTER
- Резюме
- Вопросы и ответы
- ГЛАВА 3 Знакомство с SQL Server 2000
- Установка и запуск Microsoft SQL Server
- Требования для инсталляции SQL Server 2000
- Установка SQL Server 2000
- Запуск и остановка SQL Server
- Управление способом запуска SQL Server
- Основы работы с SQL Server 2000
- Запуск программы SQL Server Enterprise Manager
- Создание базы данных с помощью программы SQL Server Enterprise Manager
- Создание таблиц в базе данных SQL Server
- Использование программы SQLServer Enterprise Manager для создания таблиц базы данных SQL Server
- Создание идентификационного поля для уникальной идентификации записей
- Использование других методов для генерации первичных ключей
- Создание поля с первичным ключом
- Использование программы SQL Query Analyzer для доступа к базе данных
- Просмотр всех объектов базы данных с помощью хранимой процедуры sp_help
- Использование существующей базы данных
- Создание команд SQL в программе Query Analyzer
- Использование представлений для управления доступом к данным
- Создание представлений с помощью программы SQL Server Enterprise Manager
- Использование представлений в приложениях
- Создание представления с помощью программы SQL Query Analyzer
- Создание и запуск хранимых процедур
- Запуск хранимых процедур в окне программы SQL Query Analyzer
- Создание хранимой процедуры с помощью программы SQL Query Analyzer
- Отображение текста существующих представлений или хранимых процедур
- Создание триггеров
- Бизнес-ситуация 3.1: создание триггера для поиска созвучных слов
- Управление пользователями и средства безопасности с помощью программы SQL Server Enterprise Manager
- Создание и сопровождение учетных записей пользователей
- Управление ролями с помощью программы SQL Server Enterprise Manager
- Тестирование системы безопасности с помощью программы SQL Query Analyzer
- Применение ограничений безопасности в программе SQL Query Analyzer
- Определение подключенных пользователей
- Завершение процесса с помощью команды KILL
- Удаление объектов базы данных
- Бизнес-ситуация 3.2: SQL-сценарий для создания базы данных
- Резюме
- Вопросы и ответы
- ГЛАВА 4 Модель ADO.NET: провайдеры данных
- Обзор технологии ADO.NET
- Мотивация и философия
- Поддержка распределенных приложений и отсоединенной модели программирования
- Расширенная поддержка XML
- Интеграция с .NET Framework
- Внешний вид объектов ADO.NET
- ADO.NET И ADO 2.X
- Место ADO.NET в архитектуре .NET Framework
- Прикладные интерфейсы
- Провайдеры данных ADO.NET
- Провайдер данных SqICIient
- Провайдер данных Oledb
- Провайдер данных Odbc
- Основные объекты
- Объект Connection
- Объект Command
- Применение объекта Command с параметрами и хранимыми процедурами
- Выполнение команд
- Метод ExecuteNonQuery
- Метод ExecuteScalar
- Метод ExecuteReader
- Объект DataReader
- Использование объектов Connection и Command во время создания приложения
- Другие провайдеры данных
- Бизнес-ситуация 4.1: создание процедуры для архивирования старых заказов по годам
- Резюме
- Вопросы и ответы
- ГЛАВА 5 ADO.NET: объект DataSet
- Компоненты объекта DataSet
- Ввод данных в объект DataSet
- Определение схемы объекта DataTable
- Вставка данных в объект DataTable
- Обновление данных в объекте DataSet
- Состояние и версия записи
- Обработка ошибок ввода данных в записи и поля
- Доступ к данным с помощью объекта DataTable
- Поиск, фильтрация и сортировка записей
- Отношения между таблицами
- Ограничения
- Применение объекта DataSet
- Резюме
- Вопросы и ответы
- ГЛАВА 6 ADO.NET: объект DataAdapter
- Передача данных из источника данных в объект DataSet
- Обновление источника данных
- Указание команд обновления
- Использование объекта CommandBuilder
- Явное указание команд обновления
- Вставка бизнес-логики в команды обновления
- Использование компонента DataAdapter во время создания приложения
- Бизнес-ситуация 6.1: комбинация нескольких связанных таблиц
- Резюме
- Вопросы и ответы
- ГЛАВА 7 ADO.NET: дополнительные компоненты
- Обнаружение конфликтов при параллельном доступе к данным
- Отображения таблиц и полей
- Объект DataView
- Бизнес-ситуация 7.1: просмотр данных из разных источников
- Строго типизированные наборы данных
- Резюме
- Вопросы и ответы
- ГЛАВА 8 Работа с проектом базы данных среде Visual Studio .NET
- Создание проекта базы данных
- Ссылки на базы данных
- Сценарии
- Сценарии создания данных
- Сценарии изменения данных
- Запуск сценария
- Командные файлы
- Запросы
- Резюме
- Вопросы и ответы
- ГЛАВА 9 XML И .NET
- Обзор XML
- Семейство технологий XML
- XML и доступ к данным
- Классы XML на платформе .NET
- Применение модели Document Object Model
- Применение технологии XPATH
- Утилита SQLXML
- Инсталляция и конфигурирование утилиты SQLXML
- Результаты конфигурирования
- Применение XML, XSLT и SQLXML для создания отчета
- Резюме
- Вопросы и ответы
- ГЛАВА 10 ADO.NET и XML
- Основные принципы чтения и записи XML-данных
- Чтение XML-данных
- Запись XML-данных
- Формат DiffCram
- Бизнес-ситуация 10.1: подготовка XML-файлов для бизнес-партнеров
- Создание объекта XmlReader с помощью объекта Command
- Объект XmlDataDocument
- Резюме
- Вопросы и ответы
- ГЛАВА 11 Web- формы: приложения на основе ASP.NET для работы с базами данных
- Обзор технологии ASP.NET
- HTML- элементы управления и серверные элементы управления
- Дополнительные преимущества технологии ASP.NET
- Доступ к базе данных с помощью ASP.NET
- Включение учетной записи ASP.NET в состав учетных записей SQL Server
- Применение параметра TRUSTED_CONNECTION
- Применение элемента управления DataGrid
- Повышение производительности приложений с помощью хранимых процедур
- Резюме
- Вопросы и ответы
- ГЛАВА 12 Web- службы и технологии промежуточного уровня
- Применение промежуточного уровня для презентационной логики
- Обработка данных на промежуточном уровне
- Создание повторно используемых компонентов промежуточного уровня
- Использование компонента в другом приложении
- Доступ к объектам с помощью Web-служб
- Публикация существующего компонента с помощью Web-службы
- Доступ к Web-службе программными средствами
- Заключительные замечания
- Резюме
- Вопросы и ответы