
КонспектЛекций
.pdf
Dim lngRecordCount As Long
'Счетчик найденных записей
Set db = CurrentDb
Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) str = ""
lngRecordCount = 0
If rs.RecordCount <> 0 Then rs.MoveFirst
Do Until rs.EOF
'Если текущая запись удовлетворяет условию...
If rs![LastName] = "Иванова" Then
'Инкримируем счетчик найденных записей lngRecordCount = lngRecordCount + 1 str = str & rs![ID_People] & ", "
End If rs.MoveNext Loop
str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount
Else
str = "Таблица ""tblPeoples"" не содержит записей."
End If Debug.Print str rs.Close db.Close
End Sub
Option Compare Database
Option Explicit
Sub Cycle01_1() '--------------------------------------------------------
'Цикл по записям таблицы "tblPeoples" от начала до конца
'--------------------------------------------------------
'База данных
Dim db As Database
'Набор записей
Dim rs As Recordset
'Строка
Dim str As String
'Количество записей в наборе записей
Dim lngRecordCount As Long
'db - текушая база данных
Set db = CurrentDb
Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset)
'rs - набор записей на основе таблицы "tblPeoples"
'При инициализации набора записей мы можем точно
'определить, есть ли в этом наборе записи или нет.
'Свойство "RecordCount" набора записей посли его
'инициализации, по идее, должна сождержать количество
'записей набора, однако это не так. Если в наборе есть
'записи это свойство отлично от нуля, но не содержит
'их количество. Для определения количества записей
'необходимо перейти на последнюю запись набора, и после
'этого в свойстве "RecordCount" будет находиться
'количество записей набора.
'Если в наборе rs есть записи...
If rs.RecordCount <> 0 Then rs.MoveLast
' Переходим на последнюю запись (чтобы "RecordCount"
71

' содержало верное значение)
lngRecordCount = rs.RecordCount
' Считываем количество записей в переменную
rs.MoveFirst 'Переходим на первую запись набора
' Заполняем текстовую переменную str количеством записей
str = "Количество записей в таблице ""tblPeoples"": " & lngRecordCount & vbCrLf
'Свойство EOF (End Of File) набора записей становиться истинным ПОСЛЕ последней 'записи набора,точно как и свойство BOF (Begin Of File) становиться истинным ПЕРЕД 'первой записью набора.
'Цикл "Пока не кончатся записи в наборе rs" Do Until rs.EOF
'Добавляем в переменную str имнена полей, их ' значения и символ перевода строки
str = str & "ID_People: " & rs![ID_People] & vbCrLf
str = str & "ID_RecordStatus: " & rs![ID_RecordStatus] & vbCrLf str = str & "LastName: " & rs![LastName] & vbCrLf
str = str & "FirstName: " & rs![FirstName] & vbCrLf str = str & "MiddleName: " & rs![MiddleName] & vbCrLf str = str & "PeopleSex: " & rs![PeopleSex] & vbCrLf str = str & "BirthDate: " & rs![BirthDate] & vbCrLf str = str & "------------" & vbCrLf
rs.MoveNext
'Переходим на следующую запись
Loop
'Конец цикла
Else
'Если записей нет...
'Заполняем текстовую переменную str сообщением об
'отсутствии записей
str = "Таблица ""tblPeoples"" не содержит записей."
End If
'Печатаем содержимое переменной str в окне отладки
Debug.Print str rs.Close
'Закрываем переменную набора записей db.Close
'Закрываем переменную базы данных
End Sub
Программирование в формах.
Определяя имя для поля, элемента управления или объекта, полезно проверить, не совпадает ли это имя с именем свойства или другого элемента, используемого Microsoft Access; в противном случае иногда могут возникать неверные результаты. Например, при ссылке на значение поля «Name» в таблице «NameInfo» с использованием конструкции NameInfo.Name будет возвращаться значение свойства таблицы Имя (Name), а не значение поля «Name».
Простейшим способом обойти неопределенность в именах является использование оператора ! вместо оператора . (точка) в ссылках на значения полей, элементов управления и объектов:
[NameInfo]![Name]
Пример запроса, созданного как текстовая строка плюс значения текстовых переменных. Запрос выбирает из таблицы «_v2» в таблицу «_v4» те записи, значение поля nn в которых больше нуля и меньше значения переменной целого типа var_numb.
Dim S As String
S = "SELECT * INTO [_v2] FROM [_v4] WHERE (([_v4].nn<=" + Str(var_numb) + _ ")and([_v4].nn>0))"
DoCmd.RunSQL S
72

Классическая фраза, которой приходится завершать функцию, если в результате ваших действий значения некоторых полей в форме должны измениться, а этого почему-то не видно:
Forms![Моя форма].Refresh
Работа с элементом «поле со списком» (Элемент управления на странице доступа к данным, щелчок по кнопке-стрелке которого приводит к раскрытию списка, в котором можно выбрать значение или ввести его прямо в поле с клавиатуры).
Окно свойств для поля со списком, который взят из работающей формы и содержит названия стран. Эти названия берутся из таблицы countries
спомощью соответствующего
запроса.
Установка исходных данных для поля (текст в строке свойств «источник строк»):
SELECT countries.country, countries.name_rus, countries.currency_rus FROM countries;
При этом из трёх столбцов видимым является только второй.
Установка начального значения для поля со списком из программы:
Private Sub Form_Open(Cancel As Integer)
73

var_country.SetFocus var_country.SelText = "Россия" End Sub
Реакция на событие «После обновления»:
Private Sub var_country_AfterUpdate() info_1.Caption = var_country.Column(1)
Forms![Основная форма].Refresh
End Sub
Работа с элементом «Диаграмма»
Microsoft Graph позволяет изменить расположение компонентов диаграммы (таких как легенда), формат надписей, цвета и узоры, а также масштабы по осям. Чтобы изменить данные, используемые для создания диаграммы, следует изменить базовую таблицу или другой источник записей, либо запрос, указанный в свойстве Источник строк (RowSource).
В режиме конструктора формы или отчета создаваемая диаграмма отображает примеры данных. Чтобы увидеть реальные текущие данные, переключитесь в режим формы или предварительного просмотра либо закройте форму или отчет, а затем снова откройте их.
СУБД MySQL
MySQL – клиент-серверная система управления реляционными базами данных, которая содержит многопоточный SQL-сервер, обеспечивающий поддержку различных вычислительных машин баз данных, а также несколько различных клиентских программ и библиотек, средства администрирования и широкий спектр программных интерфейсов. Разработкой и сопровождением системы занимается компания MySQL AB (Швеция, David Axmark).
Характеристики СУБД
SQL СУБД (реляционная), быстрая, но не оптимизированная под поиска и добавления, если предстоят частые изменения.
Стандарты: entry level SQL92, ODBC levels 0-2.
Лицензия - GPL/LGPL. Для хостинга лицензия не нужна.
Написана на C и C++. Базовая платформа: Solaris 2.7-2.8, SuSE Linux 7.1 (ядро 2.4, ReiserFS), но работает также в других ОС.
Многопотоковая.
API для C, C++, Java, Eiffel, Perl, PHP, Python, и др.
Парольная защита.
Таблицы в виде B-tree со сжатием индекса. До 32 индексов на таблицу. До 16 колонок на индекс.
По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб.
Записи переменной длины. Есть примеры использования MySQL с 60000 таблиц и 5 миллиардами строк.
Поддержка koi8-r и cp1251 (сортировка, сравнение и т.д.).
Клиенты могут соединяться по TCP/IP (можно использовать только, если никто не подслушивает) или Unix socket.
Имеются расширения к ANSI SQL92. Отсутствующие возможности ANSI SQL92:
74

Вложенные подзапросы хранимые процедуры и тригеры (тригеры не планируются совсем) Внешние ключи Представления
Основные модули СУБД
mysql – клиентская часть СУБД. Она обеспечивает интерфейс командной строки с СУБД MySQL, и возможность неинтерактивной пакетной обработки.
mysqlaccess – используется, чтобы внести в список привилегии пользователя для конкретной базы данных. Это дает информацию, которая может быть полезна при диагностировании проблем с доступом пользователей к данной базе данных.
mysqladmin – выполняет административные функции. Данная команда может использоваться для создания баз данных,изменения пароля пользователя (администратор может изменить пароль любому пользователю, а рядовой пользователь – только свой собственный), перезагрузки и остановки сервера, просмотра списка процессов, запущенных на сервере.
mysqld – программа является ядром СУБД MySQL. Она запускается как демон в системе и принимает подключения из клиентских программ, выполняя запросы и возвращая результаты. Она многопоточная, то есть обработает больше чем один запрос одновременно.
mysqldump – программа используется для создания дампа содержания базы данных MySQL. Она пишет инструкции SQL в стандартный вывод. Эти инструкции SQL могут быть переназначены в файл. Можно резервировать базу данных MySQL, используя mysqldump, но при этом Вы должны убедиться, что в этот момент с базой данных не выполняется никаких других действий.
mysqlshow – программа может использоваться, чтобы показать, с какими базами данных MySQL работает, какие таблицы данная база данных содержит, и какие поля есть в таблице в данной базе данных.
Типы данных
|
|
|
BIGINT [(length)] |
|
|
[UNSIGNED] |
|
8 байт целое (если компилятор поддерживает такой тип) |
[ZEROFILL] |
|
|
|
|
|
BLOB |
|
Двоичный объект (максимальная длина 65535 байт) |
|
|
|
CHAR(NUM) |
|
Строка фиксированной длины (1 <= NUM <= 255) |
|
|
|
|
|
Сохраняет информацию о дате. Использует формат "YYYY-MM-DD". Может модифицироваться как строка |
|
|
или число. |
DATE |
|
Диапазон для этого типа данных от 0000-00-00 до 9999-12-31. Так что "проблема 2000" здесь не стоит. В |
|
|
отличие от TIMESTAMP, DATE принимает годы и в виде двух цифр от 0000 до 0099. Тип DATE имеет длину 4 |
|
|
байта. |
|
|
|
|
|
Объединение типов DATE и TIME. Тип DATETIME идентичен типу TIMESTAMP со следующими исключениями: |
|
|
Когда запись вставляется в таблицу, содержащую поля типа DATETIME, поле DATETIME не изменяется. |
DATETIME |
|
Диапазон для поля типа DATETIME: '0000-01-01 00:00:00' - '9999-12-31 23:59:59' при использовании в |
|
|
контексте строки, и '00000000000000' - '99991231235959' при использовании в контексте числа. |
|
|
Тип DATETIME имеет длину 8 байт. |
|
|
|
DECIMAL |
|
Десятичное число с плавающей запятой. |
(length,dec) |
|
|
|
|
|
|
|
|
DOUBLE |
|
Число (4 или 8 байт) двойной точности с максимальной длиной и фиксированном числом десятичных чисел. |
[(length,dec)] |
|
|
|
|
|
|
|
|
FLOAT |
|
Номер с плавающей запятой. FLOAT(4) и FLOAT одиночная точность. FLOAT(8) обеспечивает двойную |
[(precision)] |
|
точность. |
|
|
|
FLOAT |
|
Число одиночной точности с максимальной длиной и фиксированном числом десятичных чисел (4 байта). |
[(length,decimals)] |
|
|
|
|
|
|
|
|
INT [(length)] |
|
Целое (4 байта). |
[UNSIGNED] |
|
|
|
|
|
|
|
|
75

[ZEROFILL] |
|
|
|
|
|
INTEGER |
|
|
[(length)] |
|
Целое число 4 байта |
[UNSIGNED] |
|
|
|
|
|
[ZEROFILL] |
|
|
|
|
|
LONGBLOB |
|
Двоичный объект с максимальной длиной 2**32 байт. |
|
||
MEDIUMBLOB |
|
Двоичный объект с максимальной длиной 16777216 байт. |
|
|
|
MEDIUMINT |
|
|
[(length)] |
|
Целое (3 байта). |
[UNSIGNED] |
|
|
|
|
|
[ZEROFILL] |
|
|
|
|
|
REAL |
|
Идентично DOUBLE (8 байт). |
[(length,dec)] |
|
|
|
|
|
|
|
|
SMALLINT |
|
|
[(length)] |
|
Целое (2 байта). |
[UNSIGNED] |
|
|
|
|
|
[ZEROFILL] |
|
|
|
|
|
TINYBLOB |
|
Двоичный объект с максимальной длиной 255 байт. |
TINYINT [(length)]
[UNSIGNED] Целое число (1 байт).
[ZEROFILL]
VARCHAR(NUM) |
|
Строка переменной длины (1 <= NUM <= 255) |
|
|
|
|
|
Хранит информацию о времени. Использует формат "HH:MM:SS". Может использоваться как строка или |
TIME |
|
число. |
|
|
Данные типа TIME имеют длину 3 байта. |
Автоматически изменяется при вставке/обновлении. Имеет формат YYMMDDHHMMSS или
YYYYMMDDHHMMSS. Когда используете mysql с ODBC и Access Вы должны использовать значение 14 для
TIMESTAMP(NUM) NUM, поскольку это заставляет MySQL всегда использовать в годах четыре цифры. Значение 12 заставит MySQL использовать в году две цифры. Значение по умолчанию - 14.
В случае таблиц с несколькими полями TIMESTAMP только первое такое поле будет модифицироваться автоматически.
Физическая организация данных
Каждая база данных находится в своём каталоге, имя которого соответствует имени базы. Каждая таблица находится в отдельном файле <имя таблицы>.MYD, индекс в файле <имя таблицы>.MYI, файл определения таблицы <имя таблицы>.frm
Основные команды MySQL
СУБД MySQL оперирует подмножеством языка SQL, соответствующим спецификации ANSI SQL 92.
76

Методы организации удалённого доступа к данным.
1. Интерфейсы ODBC, OLE DB и ADO.
(в электронном варианте лекции нет)
2. Интернет-доступ к базам данных.
(в электронном варианте лекции нет)
77

Перспективы развития СУБД.
1.Недостатки реляционной модели.
Реляционная модель данных не допускает естественного представления данных со сложной (иерархической) структурой, поскольку в ее рамках возможно моделирование лишь с помощью плоских отношений (таблиц). Все отношения принадлежат одному уровню, многие значимые связи между данными либо теряются, либо их поддержку приходится осуществлять в рамках конкретной прикладной программы.
По определению в реляционной модели поля кортежа могут содержать лишь атомарные значения. Однако, в приложениях САПР (ГИС) и системах искусственного интеллекта должны проводиться операции со сложно-структурированными объектами2.
Слишком высокий уровень деструктуризации (раздробления) данных по многочисленным таблицам, что (1) уменьшает скорость выполнения запросов, (2) увеличивает их сложность, а значит возможность совершения дополнительных ошибок.
Кроме того, имеются определенные недостатки и в релизации тех возможностей, которые прямо не предусматриваются реляционной моделью, но стали непременным атрибутом всех современных СУБД:
Цикл существования реляционной базы данных состоит в переходе от одного целостного состояния к другому. Однако, нельзя избежать такой ситуации, когда пользователь вводит данные, формально удовлетворяющие ограничениям целостности, но не соответствующие реальному состоянию предметной области. В этом случае предыдущее значение данных будет утеряно.
Реляционная СУБД выполняет над данными не только те действия, которые задает пользователь, но и дополнительные операции в соответствии с правилами, заложенными в базу данных. Всегда ли хороши эти правила?
2.Интеллектуальный анализ данных (data mining)
– процесс выявления значимых корреляций, образцов и тенденций в больших объёмах данных. Роль такого анализа возрастает с увеличением объёма информационных хранилищ (Data Warehouse). Он в основном применяется в бизнес-приложениях аналитиками и руководителями компаний. Для этих категорий пользователей разрабатываются высокоуровневые инструментальные средства, позволяющие решать достаточно сложные практические задачи без специальной математической подготовки.
В бизнес-приложениях наибольший интерес представляет интеграция методов интеллектуального анализа данных с технологией оперативной аналитической обработки данных (OLAP – On-Line Analytical Processing). Термин OLAP ввёл Кодд в 1993 г. В
своей статье он рассмотрел недостатки реляционной модели, в первую очередь невозможность «объединять, просматривать и анализировать данные с точки зрения множественности измерений». При этом имеется в виду именно многомерное концептуальное представление информации, а не структура таблиц базы данных, хотя в последнее время появились СУБД, уходящие от реляционных отношений в сторону многомерных банков данных.
2 Пример:
Пусть нам необходимо создать базу данных земельных участков. Каждый участок задается координатами узлов ломаной линии, ограничивающей его по периметру. В этом случае спроектировать реляционную таблицу невозможно, т.к. заранее не известно количество узлов для всех участков. Также невозможно написать общие процедуры (вычисление площади, нахождение пересечения и т.д.) для всех случаев.
78

3. Постреляционные базы данных.
Постреляционная модель данных представляет собой расширенную реляционную модель, в которой отменено требование атомарности атрибутов. Наиболее известное воплощение этой модели – многомерные таблицы, т.е. таблицы, в полях которых можно хранить другие таблицы. Известными представителями таких СУБД являются системы Adabas, Pick и Universe.
4. Отказ от нормализации отношений.
Во многом нормализация отношений нарушает иерархические связи между объектами, характерные для выбранной предметной области. В настоящий момент уже существует теоретическое обоснование работы с ненормализованными отношениями и практические реализации подобных систем. В обычных реляционных СУБД ненормализованные таблицы ведут к увеличению времени обработки данных и к уменьшению надёжности.
5. Объектно-реляционные базы данных.
Одной из наиболее известных СУБД этого вида является система Postgres (PostgreSQL) – автор Майкл Стоунбрейкер, – в которой реализованы многие интересные средства: поддерживается темпоральная (обеспечивающая временные срезы3) модель хранения и доступа к данным и в связи с этим абсолютно пересмотрен механизм журнализации изменений, откатов транзакций и восстановления БД после сбоев; обеспечивается мощный механизм ограничений целостности; поддерживаются ненормализованные отношения (работа в этом направлении началась еще в среде INGRES). В POSTGRES допускается хранение в полях отношений данных абстрактных, определяемых пользователями типов. Это обеспечивает возможность внедрения поведенческого аспекта в БД, т.е. решает ту же задачу, что и ООБД, хотя, конечно, семантические возможности модели данных POSTGRES существенно слабее, чем у объектноориентированных моделей данных.
|
|
|
|
|
|
|
Простые данные |
|
Сложные данные |
|
|
|
|
|
Наличие средств запросов |
|
Реляционные системы |
|
Объектно-реляционные системы |
|
|
|
|
|
Отсутствие средств запросов |
|
Файловые системы |
|
Объектно-ориентированные системы |
|
|
|
|
|
6. Язык SQL-3 и СУБД Oracle 8.
Попытки совместить средства манипулирования данными реляционной модели и способы описания внешнего мира объектно-ориентированной модели получили развитие в языке SQL-3. 1) Характеристики объекта определяется описанием строки таблицы. Поэтому вводится специальная возможность описания нового типа данных:
Create type Address ( number char (6), street char (30), aptno integer, city char (30), state char (2),
zip integer
);
На основе нового типа могут быть определены таблицы, например:
Create table Addresses of Address;
Новые типы допускается использовать и для определения столбцов (т.е. игнорируется требование атомарности атрибутов реляционной модели):
Сreate table People of new type Person ( name char (30),
3 Основной тезис темпоральных систем состоит в том, что для любого объекта данных, созданного в момент времени t1 и уничтоженного в момент времени t2, в БД сохраняются (и доступны пользователям) все его состояния во временном интервале [t1,t2).
79

address Address, birthdate date,
);
Наследование определяется с помощью фразы under.
Create type Employee under Person ( empno char(10),
dept ref(Department)
);
Здесь атрибут dept является ссылкой на объект, хранящийся в таблице Department. Т.е. в понятиях реляционной модели в этом столбце должен быть записан внешний ключ, указывающий на на одну из строк таблицы Department. На самом деле, в SQL-3 предполагается, что каждый объект имеет уникальный идентификатор - OID, именно он используется при создании ссылок на объекты.
Также в операторе CREATE TABLE можно определить и методы доступа к вновь созданным типам данных:
Create table People of new type Person ( name char(30),
address Address, birthdate date
function age(:р ref(Person)) return date; begin
current_age:=:р.birthdate-current_date; return current_age;
end;
);
В этом примере задана функция age, которая вычисляет текущий возраст объекта типа Person, хранимого в таблице People. К данной функции можно обращаться из оператора SELECT.
Oracle8i совместим с минимальным уровнем ANSI/ISO (SQL92). Он поддерживает большинство возможностей, заложенных в более продвинутые уровни SQL92, и даже некоторые из SQL3, но зачастую эти возможности реализованы в нем по-своему. В Oracle создан свой язык для создания триггеров, хранимых процедур и просто скриптов (в Oracle их принято называть безымянными блоками). Этот язык получил название PL/SQL (Program Language SQL). Внешней процедурой в Oracle является подпрограмма, хранимая в DLL, или метод элемента библиотеки Java-класса.
В версии 8.0 были введены объектные типы данных. Такие типы данных можно применять при создании локальных и пакетных переменных, при объявлении колонок БД и при объявлении типа записи в таблицах БД. Причем в случае, когда объект олицетворяет всю запись целиком в качестве первичного ключа, используется так называемая объектная ссылка (REF). REF является вполне самостоятельным типом данных и может использоваться для ссылки на такую объектную запись из других таблиц. Объекты поддерживают только инкапсуляцию, но не поддерживают не наследования, не полиморфизма.
7. Объектно-ориентированные базы данных.
В объектно-ориентированной парадигме предметная область моделируется как множество классов взаимодействующих объектов.
Направление объектно-ориентированных баз данных (ООБД) возникло сравнительно давно. Публикации появлялись уже в середине 1980-х гг. Среди языков и систем программирования наибольшее первичное влияние на ООБД оказал Smalltalk. Этот язык сам по себе не является полностью пионерским, хотя в нем была введена новая терминология, являющаяся теперь наиболее распространенной в объектно-ориентированном программировании.
Структура объектной модели описываются с помощью трех ключевых понятий:
80