Работа с ADO в Delphi. Часть 5

4 минуты на чтение

Ну что же, решил вспомнить старое. Если честно, то не по своей воле, а по просьбе одного читателя моего блога, который попросил показать, как можно выполнять запросы к БД MS Access и сравнивать в условии даты. По его словам у него возникли проблемы при сравнении дат (то есть по выборке записей, по условию дат), если тип поля в БД MS Access стоит — Дата/Время, то появляется примерно ошибки следующие:

  • Неверный синтаксис SQL-запросов
  • Несоответствие типов данных

Ну тут я предложу два варианта решения проблемы, возможно их и больше.

Первый вариант довольно простой. Создаем базу в MS Access, и создаем необходимые Вам поля (у меня id-Счетчик, dat-Текстовый), а поле, где должна находиться дата, указываем тип — Текстовый. То есть, у нас дата будет храниться, как обычный текст, записывать Вы сможете в любом формате (в котором Вам нужно), а делать SQL-запрос и в условии сравнивать текстовые значения — это без проблем, запрос будет выполнен без всяких синтаксических ошибок.

Давайте создадим наш проект. Тут немного, возможно, будет удивительно, но теперь большинство исходников будут выкладываться на блог в проекте Delphi XE. Это, во-первых, связано с переходом с Windows XP на Windows 7 (давно пора уже было это сделать).

В своем проекте, я установил следующие компоненты:

  • TADOConnection
  • TADOQuery
  • TButton

Так как, у меня уже установлен Rad Studio XE, то данные компоненты, я устанавливал с вкладки dbGo, а не как, в версии Delphi 7ADO.

Отображать данные, мы нигде не будем, а просто, для проверки выведем их в цикле, чтобы просто убедиться, что наш запрос выполнен правильно.

Вот такая у меня структура вышла моей БД.

А вот пример такого запроса, но не забывайте, что в БД Access в поле dat, стоит тип — Текстовый.

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
   try
    with ADOQuery1 do
     begin
       SQL.Clear;
       SQL.Add('SELECT * FROM MyTable WHERE dat='''+'07.05.2011'+'''');
       Active:=True;
       for i := 0 to RecordCount-1 do
         begin
           ShowMessage(FieldByName('dat').AsVariant);
         end;
     end;
   finally
     //-//-//-//-//-//
   end;
end;

Данный запрос, выводит одну запись, при следующих данных в таблице:

Что касается второго метода решения данной проблемы, то тут, мы будет устанавливать в поле dat тип - Дата/Время и установим формат — дд.мм.гггг (Краткий формат даты). Ниже приведена структура БД (поля и их тип данных).


Тут, нам необходимо будет использовать параметры. Для этого, выделяем компонент TADOQuery и в свойстве Parameters, создаем новый параметр, где в свойстве Name задаем — data, а в свойстве DataType - ftDataTime.

Дальше, на событие OnClick кнопки, пишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
   try
    with ADOQuery1 do
     begin
       SQL.Clear;
       SQL.Add('SELECT * FROM MyTable WHERE dat=:data');
       Parameters.ParamByName('data').Value:=FormatDateTime('dd.mm.yyyy',Date);
       Active:=True;
       for i := 0 to RecordCount-1 do
         begin
           ShowMessage(FieldByName('dat').AsVariant);
         end;
     end;
   finally
     //-//-//-//-//-//
   end;
end;

При значениях в таблице:

У меня вывело 1 запись, что говорит о работоспособности запроса и программы в целом.

Определения значения параметра запроса, может осуществлять до запроса или после него. Ошибки при этом возникнуть не должно

Ну и напоследок, хотел бы сказать, про сами запросы в MS Access, на выборку записей по условию даты. В самом MS Access, в запросе, дату в условии, необходимо заключать в знаки #. Пример:

SELECT * FROM MyTable WHERE dat BETWEEN #09.02.2011# AND #08.05.2011#

Но, в Delphi, данный метод не работает, поэтому приходится работать, при помощи параметров.

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Всем здравствуйте, в этой статье я хотел бы снова обратить внимание на Базы данных, а в частности работа с Базами данных по технологии ADO. Когда пользователь создает приложение на Delphi, работающего с СУБД, к которой присоединяется по технологии ADO, то к фа...
Всем привет, и вот мой первый урок, думаю урок полезный, так как работа с базами данных в Delphi очень важно, а тем более Access на мой взгляд самая легкая база данных, с которой можно работать в Delphi. В этой статье я расскажу Вам как эту самую Базу данных A...
Ну вот не долго думая, подошла вторая часть по работе с ADO в DELPHI на примере БД — MS Excel. В данной статье мы рассмотрим добавление и редактирование данных, так как с удалением тут возникли проблемы, в связи с тем, что данный драйвер не поддерживает удален...