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.
Читать дальше