Тема 10 Разработка
клиентского приложения.
Цель: Изучить принцип построения клиентского приложения.
Вопросы лекции:
1. Построение клиентского приложения.
2. Исключения.
1. Чтобы подключить приложение клиента к базе данных
клиент/сервер с помощью ODBC, прежде всего
необходимо предоставить информацию об источнике данных ODBC. Для подключения
клиента к разным серверам может потребоваться разный набор информации. ODBC
позволяет предоставить всю эту информацию
только за счет указания одного имени источника данных (data
source name - DSN), или DSN-имени. Поэтому в
случае необходимости достаточно сделать ссылку на него, а не создавать всякий
раз полный пакет информации. Таким образом, для приложения клиента упрощается
процесс указания комбинации драйвера, базы данных и (по требованию) учетной
записи и пароля.
Для указания имени источника данных ODBC на компьютере
клиента выполните следующее:
1. Убедитесь в том, что база
данных SQL Server установлена и запущена, а также что
она доступна с компьютера клиента, т.е. отсутствуют какие-либо проблемы с
сетевым соединением, безопасностью и т.д.
2. Откройте диалоговое окно
«Панель управления»
3. В панели управления выберите
значок «Источники данных ODBC» для открытия диалогового окна администратора
источников данных ODBC. Список источников данных, представленных в этом окне,
на разных компьютерах может быть разным в зависимости от конфигурации
программного обеспечения.
На этом этапе можно создать
один из трех типов имен источников данных ODBC.
-
пользовательское DSN-имя, которое может применяться только
одним пользователем и только на данном компьютере
-
системное DSN-имя, которое может использоваться всеми
пользователями данного компьютера. Кроме того, этот тип источника данных
требуется при создании приложения для работы с базой данных в Internet
-
файловое DSN-имя, которое может быть скопировано и
использовано на других компьютерах.
Рассмотрим создание системного
DSN-имени:
1. В окне администратора
источников данных ODBC активизируйте вкладку «системный
DSN»
2. Щелкните по кнопке «добавить…»
3. Появится диалоговое окно
создания нового источника данных. Щелкните на том имени драйвера базы данных (в
данном случае это – SQL Server), которое
предполагаете использовать
4. Щелкните по кнопке «Готово»,
после чего на экране появится диалоговое окно «Создание источника данных для
SQL-сервера»
5. В поле «Имя» укажите имя
источника данных, которое может быть любым, например «CONNECTION»
6. По желанию можно также ввести
краткое описание этого источника данных в поле «Описание»
7. В списке «Сервер» отобразится
список SQL-серверов, к которым ранее производилось подключение с данного
компьютера. Однако, если пользователь подключается
впервые, имя требуемого сервера необходимо ввести в это поле. При работе с
сервером, установленном на данном компьютере, можно выбрать строку (local) в качестве имени используемого сервера.
8. Следующий шаг мастера
предлагает настроить параметры аутентификации. Здесь возможны два варианта:
-
подключение с помощью параметров аутентификации Windows
NT (доступны только при установленной Windows NT)
-
подключение с указанием имени и пароля.
При выборе второго варианта
необходимо в соответствующих полях «Пользователь» и «Пароль» указать имя и
пароль для подключения к SQL-серверу. (У сервера имеется как минимум
пользователь sa (системный администратор))
Использование опции «Получить
параметры, используемые по умолчанию…» позволяет устанавливать имя пользователя
и его пароль в источнике данных
9. На следующем шаге мастера для
указания используемой по умолчанию базы данных установите флажок «использовать
по умолчанию базу данных», а потом выберите в списке нужную базу.
10. Следующее окно определяет
используемый набор символов. Обычно, если вам не требуется использовать
какой-то специфический набор символов, следует воспользоваться значениями по
умолчанию.
11. В следующем диалоговом окне
предоставляется возможность вести журнал протокола внутренних действий ODBC при
исполнении запросов. Обычно этот параметр используется только для разрешения
возникающих проблем.
12. Щелкните по кнопке «Готово» и
на экране появится диалоговое окно с более подробным описанием создаваемого
источника данных. Убедитесь в том, что все в порядке, а затем щелкните по
кнопке «Проверить источник данных…». Если все параметры заданы
верно, получите сообщение «TESTS COMPLETED SUCCESSFULLY!». После щелчка по кнопке
«Ok» новое имя источника данных будет
представлено в диалоговом окне администратора источников данных ODBC и его
можно будет использовать в приложениях.
2. Компоненты, используемые для работы с базами данных,
расположены в библиотеке компонентов на страницах Data
Access (доступ к данным) и Data
Control (управление данными).
Каждое
приложение, использующее базы данных, обычно имеет по
крайней мере по одному компоненту следующих трех типов:
-
компоненты –
наборы данных (data set),
непосредственно связывающиеся с базой данных. Это такие компоненты, как Table, Query, StoredProc.
-
компонент –
источник данных (data source),
осуществляющий обмен информацией между компонентами первого типа и компонентами
визуализации и управления данными. Таким компонентом является DataSource.
-
компоненты
визуализации и управления данными, такие, как DBGrid,
DBText, DBEdit и множество других.
Помимо указанных компонентов в приложении может
размещаться компонент Database. Этот компонент в
основном используется в приложениях, работающих на платформе клиент/сервер. Его
задачи связаны с общением с удаленным сервером, реализацией транзакций, работой
с паролями. Компонент Database целесообразно вводить
в приложение только в сравнительно редких случаях. Если он не введен явно, С++ Builder автоматически создает его для каждой используемой в
приложении базы данных.
Компонент DataSource.
Представляет собой интерфейс между прочими
компонентами доступа к наборам данных и видимыми компонентами их представления,
размещенными на форме. Именно посредством соединения с источником данных пользователь получает возможность
отображения, навигации и редактирования БД.
Каждый
набор данных должен ассоциироваться с источником, обеспечивающим
унифицированное соединение с базой данных. С другой стороны, каждый компонент
со страницы Data Controls
должен ассоциироваться с источником, чтобы принимать данные и манипулировать
ими. Компоненты TDataSource также способны
организовать парные связки таблиц по принципу master-detail
и поддерживать синхронизацию обмена.
Свойства:
DataSet |
Определяет набор данных, с которым связан его источник В инспекторе объектов свойство представлено разворачивающимся списком доступных на настоящий момент источников |
AutoEdit |
запрещает/разрешает режим редактирования данных (false / true) По умолчанию – true |
Enabled |
разрешает/запрещает доступ к источнику данных (true / false)/ По умолчанию – true |
State |
состояние набора данных |
События:
OnDataChange |
возникает, когда пользователь модифицировал текущую запись адресуемого набора данных и/или переместился к другой записи |
Компонент Table.
Представляет собой интерфейс между механизмом BDE и
компонентом TDataSource, который, в свою очередь,
образует соединение с такими компонентами представления, как TDBGrid. Table обеспечивает
доступ к каждой записи и полю таблицы базы данных. Компонент может также работать с поднабором записей в
пределах таблицы базы данных, используя диапазоны и фильтры. Компонент Table является невизуальным
объектом и виден на форме только в процессе проектирования.
Основные свойства:
DatabaseName |
псевдоним подключаемой базы данных Инспектор объектов отражает список известных псевдонимов |
TableName |
имя таблицы в выбранной базе данных Инспектор объектов отражает список доступных таблиц |
Active |
устанавливает /не устанавливает активное состояние связи с таблицей, чтобы можно было увидеть данные таблицы еще на этапе проектирования (true/false). По умолчанию – false. Значение true рекомендуется использовать на этапе проектирования только в момент отладки. В законченном приложении во всех таблицах сначала должно быть установлено Active=false, затем при событии OnCreate эти свойства могут быть установлены в true, а при событии OnDestroy эти свойства опять должны быть установлены в false. Это исключит неоправданное поддержание связи с базой данных, которое занимает ресурсы, а при работе в сети мешает доступу к базе данных других пользователей. |
IndexName |
определяет вторичный индекс для таблицы, в соответствии с которым будут упорядочены записи. Если свойство пусто, то записи следуют в порядке их занесения в базу данных |
ReadOnly |
данные таблицы доступны только для чтения, если свойство = true. По умолчанию - false |
Filtered |
активизирует режим фильтрации записей таблицы по критерию, определенному свойством Filter, если свойство = true. По умолчанию - false |
Filter |
определяет строку, задающую текущий фильтр таблицы (определенные ограничения на значения полей). При записи условия можно использовать логические операторы =, >, >=, <, <=, <>, and, or, not. Строковые константы задаются в одинарных кавычках, например: State = 'CA' or State = 'MA' При сравнении строк можно использовать символ ‘*’, означающий любое количество любых символов |
FilterOptions |
определяет характеристики процесса фильтрации: foCaseInsensitive делает сравнение строк нечувствительными к регистрам foNoPartialCompare запрещает частичное совпадение при сравнении |
RecNo |
определяет номер текущей записи |
RecordCount |
определяет общее количество записей |
Доступ
к полям. Доступ по имени поля осуществляется с помощью метода FieldByName (<имя поля>). Например, Table1->FieldByName(“Fam”) – это объект,
связанный с полем Fam. Чтобы получить значение поля
используются следующие свойства полей:
AsString – переводит значения в строку
AsInteger – перевод с целое число
AsFloat – перевод в
действительное число
AsBoolean – перевод в логическое значение
AsDateTime – перевод в тип DateTime
и т.д.
Примеры использования:
Table1->FieldByName(“Fam”)->AsString =
Edit1->Text;
Edit1->Text =Table1->FieldByName(“Fam”)->AsString ;
- Методы компонента Table
First |
перемещение к первой записи |
Last |
перемещение к последней записи |
Next |
перемещение к следующей записи |
Prior |
перемещение к предыдущей записи |
MoveTo (int i) |
перемещение к концу (при i>0) или к началу (при i<0) на i записей |
Append() |
добавляет новую пустую запись в конец набора и делает ее текущей |
Insert() |
вставляет новую пустую запись перед текущей и делает новую запись текущей |
Edit() |
начинает редактирование текущей записи |
Delete() |
удаляет текущую запись и перемещает указатель к следующей |
Post() |
фиксирует изменения, сделанные методами Append, Edit, Insert метод вызывается автоматически при смещении указателя с изменяемой записи методами навигации |
Cancel() |
отменяет внесенные изменения методами Append, Edit, Insert и возвращает набор данных в первоначальное состояние |
Попытка
перемеситься к предыдущей записи, если указатель текущей записи стоит на 1-ой
записи, или попытка переместиться к последующей записи, когда указатель текущей
записи стоит на последней записи набора, приводит к ошибке. Для контроля за началом или концом таблицы используются
следующие свойства:
Eof |
конец данных, свойство = true, если указатель переместился за конец таблицы |
Bof |
начало данных, свойство = true, если указатель переместился за начало таблицы |
Компонент DBGrid.
Регулярная сетка для отображения и редактирования
записей набора данных. Каждая запись представляется отдельной строкой.
Основные
свойства:
DataSource |
задает объект типа TDataSource, который определяет набор данных. В инспекторе объектов представлено списком доступных компонентов, например, компонентов DataSource |
ReadOnly |
данные в сетке доступны только для чтения, если свойство = true (false по умолчанию) |
Компонент DBNavigator.
Компонент представляется в виде панели из 10 кнопок,
которые позволяют управлять данными, связанного с этим компонентом набора
данных. На форме навигатор представляется в следующем виде:
Основные
свойства компонента:
DataSource |
соединяет панель навигатора с набором данных через компонент источника. Изменяя значение этого свойства во время выполнения программы, можно использовать один и тот же компонентный объект для навигации по разным таблицам |
VisibleButtons |
специфицирует кнопки, которые необходимо сделать видимыми |
ShowHint |
разрешает или запрещает высвечивать подсказку с названием кнопки, когда на нее наведен курсор |
Hints |
содержит массив текстовых подсказок для всех кнопок. Используется редактор списка кнопкой «…» |
Компонент Query.
Компонент
набора данных класса TQuery имеет большинство свойств и методов, совпадающих с Table. Во
многих случаях он может включаться в приложения вместо Table.
Дополнительные преимущества Query – возможность формировать запросы на языке SQL. Query представляет собой интерфейс между базой данных и
компонентом DataSource,
обеспечивая доступ на этапе проектирования к живым данным из одной или
нескольких таблиц. Запросы SQL могут иметь
параметры. Параметры задаются в запросе с двоеточием, предшествующим имени
параметра.
Основные
свойства:
DatabaseName |
псевдоним базы данных |
SQL |
задает SQL выражение |
Params |
список параметров, которые внесены в SQL выражение |
Программный
доступ к параметрам во время выполнения приложения осуществляется аналогично
доступу к полям Table. Свойство Params является указателем на массив параметров типа TParam, к элементам которого можно обращаться по индексу
через его свойство Items [Index]. Последовательность, в которой располагаются
параметры в массиве, определяется последовательностью их упоминания в запросе SQL.
Значения
параметров, как и значения полей, определяются такими
свойствами объектов-параметров, как Value, AsString, AsInteger и т.д.
Query1->Params->Items[0]->AsInteger = 1999;
Подcвойство Count свойства Params определяет количество параметров в запросе.
Еще
один способ обращения к параметру – метод ParamByName компонента Query.
Query1->ParamByName(“Year”)->AsInteger = 1970;
Следует
оговориться, что задание нового значения параметру само по себе еще не
обеспечивает влияния на возвращаемый результат. Надо повторно выполнить данный
запрос, чтобы ощутить изменения.
Основные
методы компонента Query.
К
основным методам можно отнести методы открытия и закрытия соединения с базой
данных.
Close |
закрывает соединение с базой данных, переводя свойство Active в false. Этот метод надо выполнять перед изменением каких-то свойств, влияющих на выполнение запроса или на отображение данных. Например, при изменении параметров запроса в свойстве SQL надо сначала методом Close закрыть соединение, связанное с прежним запросом, а потом уже выполнять новый запрос. |
Open |
открывает соединение с базой данных и выполняет запрос, содержащийся в свойстве SQL. Но этот метод применим только в том случае, если запрос сводится к оператору SELECT. |
ExecSQL |
используется для осуществления любого другого запроса, кроме SELECT. |
Разрешает
приложению клиента выполнять процедуры, хранимые на удаленном сервере базы
данных с передачей результатов клиенту.
Основные
свойства:
DatabaseName |
псевдоним базы данных сервера, на котором хранится процедура |
StoredProcName |
имя хранимой процедуры |
Params |
свойство, определяющее список параметров хранимой процедуры (определяется автоматически согласно тексту процедуры) |
Active |
активизирует выполнение хранимой процедуры |
Хранимую
процедуру необходимо подготовить к запуску: на стадии проектирования с помощью
редактора параметров, а во время выполнения – с помощью метода Prepare.Исполнение хранимой процедуры реализует метод ExecProc (если процедура возвращает результат в виде
единственной записи) или метод Open (если
процедура возвращает результирующий набор в виде множественных записей).
Задание фактических значений параметров для хранимых процедур задается с
помощью свойства Params аналогично использованию свойства Params компонента Query.
Литература:
1 Е. Мамаев
«Microsoft SQL Server 2000», БХВ-Петербург,
2004г.
Контрольные вопросы:
1 Что такое клиентское приложение?
2 Как
организовывается построение клиентского приложения?