Databases/ru

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) English (en) español (es) français (fr) italiano (it) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Цель

Эта страница освещает общие вопросы работы с базами данных в Lazarus и является начальной информацией для программистов, которые хотят написать программу, работающую с базами данных.

Наборы данных (Dataset)

Базы данных в Lazarus (или FreePascal) основывают свою работу на базовом классе TDataset. Этот класс представляет таблицу или результат запроса в Вашем приложении. Как и многие другие базовые классы, Вы не можете использовать TDataSet в своём приложении непосредственно, а используете только его потомков, которых довольно много. Они обеспечивают доступ к различным видам баз данных, таким как локальный dbase или текстовые файлы, а так же серверами баз данных, таких как PostgreSQL, Firebird, MySQl и т.п. Некоторые потомки TDataSet связываются непосредственно с таблицами базы данных, в то время как другие используют дополнительные компоненты или библиотеки.

Обратитесь к странице базы данных для получения более полной информации об этом.

Потомки Dataset, будучи не визуальными компонентами, обычно являются частью свободной библиотеки компонентов (FCL) а не библиотеки компонентов Lazarus (LCL).

Использование наборов данных

Наборы данных можно использовать и программно, и в качестве визуальных компонентов. Типичное приложение баз данных в Lazarus использует оба метода. В общем случае, первым шагом нужно выбрать соответствующего потомка TDataset для выбранной Вами базы данных, создать подключение, выбрать таблицу или создать запрос и открыть его. Это может быть сделано или в коде, во время выполнения, или помещая компонент на Вашу форму и устанавливая соответствующие свойства во времени разработки. Детали этой операции могут значительно различатся для разных потомков TDataset, так что подробности смотрите в Databases для выбранной Вами базы данных.

Когда набор данных открыт, создаётся ряд компонентов, по одному для каждого поля или столбца таблицы (запроса). Каждый компонент поля - это потомок TField, соответствующий специфическому типу данных этого поля, например, TStringField.

Использование наборов данных в коде программы

О программном доступе объясняется более подробно в "Использование компонентов Dataset и Field", вот краткий обзор:

  • Используйте потомок TDataset чтобы открыть таблицу или запрос, отфильтруйте те строки, которые хотите видеть и двигайтесь от строки к строке.
  • Используйте потомок TField для:
    • Доступа к общей информации о поле.
    • Доступа к данным текущей строки. (используя свойство AsХХХХ, например AsString, AsInteger и так далее.)
  • Используйте для обращения к полям потомка TDatasetтак же:
    • Свойство Fields, к примеру Fields[0] для самого первого поля,
    • Метод FieldByName, как пример FieldByName('AGE') вернёт поле, которое в базе данных называется 'AGE'.

Использование визуальных (db-ориентированных) компонентов

Чтобы использовать базы данных в простом, приложении Lazarus в "RAD"-стиле, обычно настраивается потомок TDataSet во время разработки и добавляются специализированные компоненты. Например:

  • Добавьте потомка dataset для выбранной Вами базы данных вместе с другими необходимыми компонентами на Вашу форму и откройте его (Установите свойство 'Active' в True).
  • Добавьте на форму компонент TDatasource (с вкладки "Data Access") и свяжите его с датасетом (установив свойство DataSet).
  • Добавьте компоненты отображения данных с вкладки "Data Controls" и свяжите их с компонентом DataSource (не dataset).
  • Большинство компонентов связываются только с одним полем, поэтому Вам надо будет установить свойство Field для каждого такого компонента.

Смотрите #Data Controls ниже.

Рабочие состояния (Статусы) Dataset

Наборы данных могут быть в нескольких состояниях (Статусах), которые отображаются в свойстве State. Вот какие состояния могут быть (смотрите TDataSetState в исходниках):

State Описание
dsInactive Набор данных закрыт, доступ к данным невозможен
dsBrowse В этом состоянии можно просматривать набор данных, искать какие-либо значения
dsEdit В этом состоянии можно редактировать данные в текущей строке. Изменённые значения не будут записаны, пока не применён метод Post.
dsInsert В этом состоянии только что вставлена новая строка данных и туда можно заносить новые значения. Строка не будет записана, пока не применён метод Post.

Другие состояния обычно являются кратковременными и обрабатываются автоматически. Они используются внутри компонента и более сложны в коде обработки. Если Ваше приложение только просматривает данные и Вы открываете набор данных во времени разработки, то Вы можете просто проигнорировать статус, поскольку он главным образом будет dsBrowse. Однако большинство приложений будут тем или иным образом всё-таки изменять данные. Если Вы используете DB-ориентированные компоненты, то они обрабатывают эти состояния автоматически. Если Вы измените текст в компоненте (к примеру) DBEdit, то он пометит набор данных в состояние dsEdit, если только Вы уже не поставили вручную статус в dsEdit или dsInsert. Если Вы будете переходить от одной записи к другой, то та запись, которая была в состоянии dsEdit или dsInsert, автоматически выполнит метод Post, при переходе на новую строку и DataSet вернётся в состояние dsBrowse. Однако если Вы обращаетесь к набору данных в коде, то его состояние Вы должны выставлять вручную. Компонент dbNavigator позволяет изменять статус самому пользователю.

Принятие и отмена изменения

Если Вы редактируете или вставляете новую запись, то значения этой записи сначала помещаются в буфер. После этого:

  • Вызов метода Dataset.Cancel удаляет новую запись (при вставке) или или возвращает старые значения записи (при редактировании).
  • Вызов метода Dataset.Post сохраняет значения (при редактировании) или новую запись (при вставке).

В некоторых потомках Dataset значения будут немедленно написаны базе данных, в то время как в других они будут сохранены во временной таблице обновлений, пока не будет вызван некий окончательный метод, чтобы сохранить все изменения в базе данных. Однако иногда, даже когда значения записаны в базу данных, Вам, вероятно, придется дополнительно вызвать метод "Commit", чтобы заставить базу данных принять эти изменения. Всё это, в значительной степени, зависит от конкретного потомка DataSet'а, поэтому за подробностями обращайтесь к описанию этого самого конкретного потомка.

Визуальные компоненты для работы с данными

Чтобы использовать любой из этих компонентов, добавьте его на форму и установите, по крайней мере, свойство datasource. Заполните так же и другие необходимые свойства.

Компоненты для работы с одним полем

Эти компоненты работают только с одним единственным полем. Кроме свойства DataSource, необходимо установить в свойстве DataField имя поля.

Список компонентов:

  • DBText Отображает на форме текстовое поле (только для чтения, без окантовки).
  • DBEdit Отображает текстовое поле, которое доступно для редактирования.
  • DBMemo Отображает многострочное текстовое поле, которое доступно для редактирования.
  • DBImage Отображает рисунок, который хранится в базе данных в BLOB-поле.
  • DBListBox и DBComboBox Позволяет заносить в таблицу базы данных значение из предопределённого списка, который хранится в свойстве Items этого компонента.
  • DBCheckBox Отображает булево поле (True\False) в виде чекбокса. Доступно для редактирования.
  • DBRadioGroup Отображает значения в виде группы радиокнопок, Читает\устанавливает значения из предопределённого списка Items.
  • DBCalendar Отображает\редактирует поля с датой в виде стандартного календарика.
  • DBGroupBox control

Компонент DBGrid

This control can show a number of fields in a row/column layout - in fact by default it shows them all. However, you can put entries into the columns collection to restrict it to specific fields and to set the widths and titles of each column.

There seem to be some issues currently with editing in dbGrid, so while editing is certainly possible, it may be safer to use it as display only (set readonly to true) and provide single field controls for editing.

Компонент Navigator

This control gives the user some direct control over the dataset. It allows the user to:

  • Move to the next or previous record, or to the start or end of the records
  • Add a new record (equivalent to a dataset.insert method call)
  • Put the dataset into edit mode
  • Delete a record
  • Post or Cancel current changes
  • Refresh the data (useful in multiuser database applications)

Key Properties:

  • VisibleButtons: Lets you control what the user can do. For example, if deletes are not allowed, hide the delete button. If you have a DBGrid attached to the same dataset, you may decide you do not need the next and prior buttons.
  • Width: If you do not show all buttons, you may want to set the width to (height*number_of_visible_buttons)