В лекции №2 вставляю модуль данных. При попытке заменить name на fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? |
Соединение с БД клиентской программы. Проблемы русских букв в InterBase
Проблемы русских букв в InterBase
Вообще то, эти проблемы касаются не только русских, а вообще любых букв, отличных от английского алфавита. Здесь нужно сделать несколько замечаний:
- Наименования идентификаторов (названий) таблиц, полей, индексов и проч. в InterBase недопустимо давать русскими буквами.
- При создании базы данных не забывайте указывать кодировку WIN1251, как кодировку по умолчанию.
- Если вы подключаете к серверу через IBConsole уже существующую базу данных, также не забывайте указывать эту кодировку.
- Если вы подключаете клиентское приложение к БД через BDE, достаточно создать псевдоним БД, в котором в качестве языкового драйвера указать Paradox ANSI Cyrillic, как это мы делали в "Технические характеристики. Создание и перенос базы данных" .
- При подключении приложения к БД с помощью механизмов "прямого доступа", таких как IBX, FIBPlus и т.п., в списке параметров нужно указать дополнительный параметр кодировки " lc_ctype =WIN1251 ", без этого вы сможете просматривать таблицы с русским текстом в полях, но не сможете добавлять новых записей, сделанных кириллицей.
- В InterBase имеется встроенная функция UPPER, которая преобразует символы строковых полей в заглавные буквы. Эту возможность нередко используют для поиска данных. Однако при работе с кириллицей она будет работать корректно лишь в том случае, если строковое поле было создано с кодировкой WIN1251 и порядком сортировки PXW_CYRL. В случае других сочетаний параметров, функция не сможет правильно отображать русский текст заглавными буквами. Например, отобразить текст поля Nazvanie из таблицы Tovar заглавными буквами можно следующим запросом: "SELECT UPPER(Nazvanie), Stoimost FROM Tovar"
- Если все же вы создали поле с кодировкой WIN1251, но не указали сортировку PXW_CYRL, а вам требуется выполнить поиск с функцией UPPER, то вы можете сменить порядок сортировки явно, прямо в запросе. Например, требуется найти запись со значением "Сахар" в поле Nazvanie. При этом мы не знаем, как пользователь вписал это название: "САХАР", "Сахар" или "сахар". Сделать поиск, не зависящий от регистра можно запросом: "SELECT * FROM Tovar WHERE UPPER(Nazvanie COLLATE PXW_CYRL) = 'САХАР'"
dbExpress
Технология dbExpress реализует так называемый однонаправленный курсор, то есть, данные можно будет листать только сверху - вниз. Это существенно ускоряет работу с базой данных, но в большинстве случаев делает технологию неудобной для клиентских приложений. Правда, начиная с шестой версии Delphi, в dbExpress появился компонент TSimpleDataSet, который создает двунаправленный курсор и снимает большинство ограничений. В то же время, программа лишается преимущества скорости однонаправленного курсора. Все это приводит к тому, что технологию dbExpress на практике используют крайне редко. Тем не менее, рассмотрим подключение программы к базе данных с помощью этой технологии.
Создайте новое приложение и спроектируйте форму такой же, как в предыдущем примере, но без компонентов BDE. Из компонентов доступа, помимо DBNavigator и DBGrid нам понадобятся: DataSource с вкладки DataAccess ; компоненты SQLConnection, SimpleDataSet и SQLQuery с вкладки dbExpress.
SQLConnection предназначен для подключения к базе данных, он является аналогом компонента TDatabase в BDE. Остальные компоненты подключаются к базе через него.
SimpleDataSet будет играть роль таблицы с двунаправленным курсором, а SQLQuery представляет собой обычный компонент запросов.
Выделите компонент SQLConnection. В его свойстве ConnectionName выберите из списка вариантов подключения IBConnection, при этом автоматически настроятся некоторые свойства, специфичные для InterBase. Далее щелкните по сложному свойству Params - загрузится окно параметров, которое нужно настроить так:
Здесь нам нужно будет вручную вписать адрес и имя файла с базой данных в параметр Database. Затем указать параметры ServerCharSet (WIN1251) и SQLDialect (3). После чего кнопкой ОК закрыть окно. Далее перевести свойство LoginPrompt в False, чтобы программа не запрашивала имя и пароль пользователя, а свойство Connected в True, чтобы соединиться с базой данных.
Выделим компонент SimpleDataSet. Переименуйте его свойство Name в TTovar (мы выбрали такое же имя, как у таблицы из прошлого примера, чтобы не менять код нажатия на кнопку). В свойстве Connection выберите SQLConnection1. Раскройте сложное свойство DataSet, и откройте подсвойство CommandText. Откроется окно редактора, в котором нужно будет составить запрос выборки всех данных из таблицы Tovar:
SELECT * FROM TOVAR:
Затем кнопкой ОК закройте окно, и можете закрыть сложное свойство DataSet. А вот свойство Active переведите в True, чтобы открыть полученный набор данных.
Теперь займемся компонентом SQLQuery1. Свойство Name переименуйте в Q1, в свойстве SQLConnection выберите SQLConnection1.
Напоследок соедините DataSource1 с компонентом TTovar, а сетку и навигатор - с DataSource1. Данные из таблицы должны отобразиться в сетке.
Код для кнопки такой же, как в предыдущем примере. Сохраните проект, скомпилируйте и попробуйте добавить пару наименований товара. Как видите, реализация подключения несколько сложней, чем в предыдущем примере, но зато на клиентский ПК не нужно устанавливать BDE!
InterBase Express (IBX)
Эта технология является "родной" для сервера InterBase, и из стандартных механизмов доступа наиболее удобна. А значит, чаще всего используют именно ее. В будущих лекциях мы поработаем с этим механизмом плотнее, а пока вкратце рассмотрим работу с ним на примере все того же приложения.
Создайте новое приложение, и разместите на форме сетку DBGrid, навигатор DBNavigator и кнопку так же, как в прошлых примерах.
На сетку поместите один компонент DataSource с вкладки DataAccess, и с вкладки InterBase следующие компоненты: IBDatabase, IBTransaction, IBTable и IBQuery.
Компонент IBDatabase выполняет подключение к базе данных, все остальные компоненты вкладки соединяются с БД через него.
Все действия с базой данных происходят на уровне транзакций, компонент IBTransaction как раз обеспечивает такую транзакцию. В приложении обязательно должен быть хотя бы один IBTransaction, соединенный с IBDatabase. В сложных многозвенных базах данных таких транзакций может быть несколько. Вообще, имеется возможность для каждого набора данных ( IBTable или IBQuery ) использовать собственный компонент IBTransaction с различными настройками. Однако делать так не рекомендуется. Обычно наборы данных разделяют на группы, например, НД только для чтения, НД только для записи, НД для чтения/записи с мягкими или жесткими условиями соединения (об этом в следующих лекциях). В этом случае для каждой группы наборов данных выделяют свой компонент IBTransaction.
Компоненты IBTable и IBQuery почти ничем не отличаются от простых Table и Query.
Итак, выделите компонент IBDatabase. Через его свойство DatabaseName найдите и подключите файл First.gdb. Далее откройте свойство Params (откроется окно редактора). В окне впишите следующие параметры:
user_name=sysdba password=masterkey lc_ctype=win1251
Обратите внимание на то, что пробелы перед и после знака "=" недопустимы. Все слова можно вводить маленькими буквами. Каждый параметр указывайте на новой строке. Нажмите кнопку ОК и закройте окно редактора параметров. Свойство LoginPrompt переведите в False, а свойство Connected в True - связь с БД установлена. В сетевом варианте обычно LoginPrompt оставляют True, чтобы знать, какой пользователь на самом деле вошел в базу данных.
Далее выделите компонент IBTransaction и в его свойстве DefaultDatabase выберите нашу БД IBDatabase1.
Затем выделите таблицу IBTable1, переименуйте ее в TTovar (свойство Name ), в свойстве Database выберите IBDatabase1. При этом в свойстве Transaction таблицы автоматически должен появиться компонент транзакций IBTransaction1. Если по каким то причинам этого не случилось, выберите его вручную. В свойстве TableName установите таблицу Tovar, а свойство Active переведите в True - таблица открыта.
Теперь выделим запрос IBQuery1. Свойство Name переименуем в Q1, в свойстве Database выберем IBDatabase1. И у этого компонента в свойстве Transaction автоматически должна появиться транзакция IBTransaction1.
Осталось только связать DataSource с таблицей TTovar, а сетку и навигатор - с DataSource.
Код нажатия на кнопку такой же, как в предыдущих примерах.
Как видите, работа с различными механизмами доступа к серверу InterBase отличается лишь в деталях. Механизм IBX отличается тем, что в приложении обязательно должна быть хотя бы один компонент транзакций. Но в реальной практике таких компонентов может быть несколько, каждый из них обычно имеет свои настройки, а различные наборы данных могут подключаться к различным компонентам транзакций. Подробнее о транзакциях мы поговорим в "Транзакции" .