Опубликован: 07.05.2010 | Уровень: специалист | Доступ: платный
Лекция 22:

Соединение с БД клиентской программы. Проблемы русских букв в InterBase

< Лекция 21 || Лекция 22: 12 || Лекция 23 >

Проблемы русских букв в 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 - загрузится окно параметров, которое нужно настроить так:

Окно параметров SQLConnection

Рис. 22.4. Окно параметров SQLConnection

Здесь нам нужно будет вручную вписать адрес и имя файла с базой данных в параметр Database. Затем указать параметры ServerCharSet (WIN1251) и SQLDialect (3). После чего кнопкой ОК закрыть окно. Далее перевести свойство LoginPrompt в False, чтобы программа не запрашивала имя и пароль пользователя, а свойство Connected в True, чтобы соединиться с базой данных.

Выделим компонент SimpleDataSet. Переименуйте его свойство Name в TTovar (мы выбрали такое же имя, как у таблицы из прошлого примера, чтобы не менять код нажатия на кнопку). В свойстве Connection выберите SQLConnection1. Раскройте сложное свойство DataSet, и откройте подсвойство CommandText. Откроется окно редактора, в котором нужно будет составить запрос выборки всех данных из таблицы Tovar:

SELECT * FROM TOVAR:
Окно редактора запросов

Рис. 22.5. Окно редактора запросов

Затем кнопкой ОК закройте окно, и можете закрыть сложное свойство 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 отличается тем, что в приложении обязательно должна быть хотя бы один компонент транзакций. Но в реальной практике таких компонентов может быть несколько, каждый из них обычно имеет свои настройки, а различные наборы данных могут подключаться к различным компонентам транзакций. Подробнее о транзакциях мы поговорим в "Транзакции" .

< Лекция 21 || Лекция 22: 12 || Лекция 23 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Назерке Сейтсаданова
Назерке Сейтсаданова
Казахстан, Усть-Каменагорск, ВКГУ им. С.Аманжолова
Наталья Статченко
Наталья Статченко
Россия, Благовещенск