Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lopp.DOC
Скачиваний:
6
Добавлен:
31.03.2015
Размер:
187.39 Кб
Скачать

  1. Программируемый доступ к базе данных

Иногда возникает необходимость решения алгоритмически сложных задач, используя в качестве исходных данные из базы данных. В Delphi предусмотрена возможность обрабатывать данные из баз данных программами на языке Паскаль – выполнять программируемый доступ к базе данных. Так придется поступить, если средствами языка SQL задачу решить невозможно. Кроме того, этот подход полезен при реализации кнопок и пунктов меню для изменения данных. Рассмотрим реализацию программируемого доступа к базе данных. При этом предстоит решить следующие задачи:

  • организовать доступ к файлам баз данных,

  • обеспечить передвижение по записям файлов,

  • поддерживать соответствие между полями в базах данных и переменными программы.

    1. Доступ к файлам баз данных

Предположим, что с помощью Database Desktop файлы базы данных созданы и туда загружены данные. Необходимо знать структуру файлов (имена полей, их типы), а также вторичные индексы. Доступ к файлам базы данных осуществляется с помощью компонент Delphi Table и Query. При использовании Table мы можем получить доступ ко всем полям и записям, при использовании Query – только к тем записям и полям в них, которые выделены в результате выполнения сформулированного на SQL запроса. Использование названных компонент ничем не отличается от описанного выше. Компоненты DataSource, DBGrid и DBEdit не нужны и их мы на форму своего приложения переносить не будем.

Допустим, что на форму перенесена компонента Table и ее свойствам даны описанные выше значения (обеспечен доступ к файлу). Поставим перед собой задачу показать на экране по очереди все записи файла (рис. 7.1). Эту задачу, естественно, можно было решить и без программы на Паскале, но покажем на ее базе некоторые характерные приемы. В качестве файлов используем созданные в гл. 5.

При запуске приложения запускается процедура

procedure TForm1.FormCreate(Sender: TObject);

begin

with Table1 do {Все действия выполняются с Table1}

begin

Active:=True; {Откроем доступ к файлу }

first;{ Установим файл в начало}

{Доступ к полям файла по имени}

Edit1.Text:=IntToStr(FieldByName('SPEC').AsInteger);

{Доступ к полям файла по порядковому номеру}

Edit2.Text:=Fields[1].AsString;

end;

end;

Рис. 7.1. Просмотр файла

В нашем примере путь и имя файла задаются в инспекторе свойств объекта Table. Их можно задавать и программно (как мы дали значение свойству Active). Вспомните стандартное диалоговое окно открытия файлов, рассмотренное нами в п. 2.2.2. Его и можно использовать, чтобы узнать имя открываемого файла.

Для обеспечения передвижения по файлу имеются стандартные процедуры (других средств для этого в нашем случае нет). С одной из них – First – мы уже ознакомились: она обеспечит установку файла на начало. После открытия файл находится в начале и по умолчанию. Остальные процедуры:

  • Last – текущей становится последняя запись файла;

  • Neхt – переход к следующей записи;

  • Prior – переход к предыдущей записи;

  • MoveBy(N) – обеспечит передвижение на заданное число записей; если N > 0, то вперед, если N < 0, то назад.

Кроме того, имеются две переменных типа Boolean, которые показывают, достигнут ли конец (начало) файла или нет:

  • EOF=True, если достигнут конец файла, False в остальных случаях;

  • BOF=True, если достигнуто начало файла, False в остальных случаях.

Вопрос: что означает ситуация EOF=BOF=True?

Реализация остальных кнопок.

procedure TForm1.Button1Click(Sender: TObject);

begin

with Table1 do

begin

{Проверим, достигнут ли конец файла}

if eof then

ShowMessage('Нет следующей записи')

else

begin

next; {Переход к следующей записи}

{Чтение значений из файла}

Edit1.Text:=IntToStr(FieldByName('SPEC').AsInteger);

Edit2.Text:=Fields[1].AsString;

end;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

with Table1 do

begin

{Проверим, достигнуто ли начало файла}

if bof then

ShowMessage('Нет предыдущей записи')

else

begin

prior; {Переход к предыдущей записи}

Edit1.Text:=IntToStr(FieldByName('SPEC').AsInteger);

Edit2.Text:=Fields[1].AsString;

end;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Table1.Active:=False; {Закроем файл}

Close;

end;

В принципе отсутствие проверок достижения конца (начала) файла не является ошибкой, просто записи не будут меняться. Легко заметить, что вместо Edit1.Text значение можно присвоить и обычным переменным программы (глобальным, локальным формальным) для дальнейшего их использования в вычислениях. При этом необходимо строго соблюдать тип переменных и все необходимые преобразования запрограммировать самому. В Delphi свойства AsInteger, AsFloat, AsString, AsDate, AsDateTime, AsBoolean должны соответствовать типу данных в файле. Преобразования между данными разных типов выполняются процедурами val и str и функциями DateToStr (дата в символьную строку), StrToDate (символьная строка в дату), IntToStr (целое в строку), StrToInt (строка в целое) и т.д. Описание этих процедур и функций можно узнать через Help. При их использовании не забывайте, что некоторые преобразования возможны всегда (число в символьную строку), а многие (строка в число) не всегда.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]