Ну что же, решил вспомнить старое. Если честно, то не по своей воле, а по просьбе одного читателя моего блога, который попросил показать, как можно выполнять запросы к БД 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, данный метод не работает, поэтому приходится работать, при помощи параметров.

Исходники, скачать можно тут (Delphi XE, БД — MS Access 2010, сохраненная под MS Access 2003)

Метки: , , , , , ,




К записи “Работа с ADO в Delphi. Часть 5” оставлено комментариев: 12.

  1. Ping:

    Все проще, в коде делфи пишем:
    Q1.Sql.Text:=’select * from table1 where date_fld = CDate(‘+Edit1.Text+’)';
    Т.е поручим аксесу самому преобразовать наш текст в тип дата при выполнении запроса.

  2. dimka:

    Именно то что искал, большое спасибо!

  3. zerdalert:

    Интересует вопрос, нигде в нете не нашел достойного ответа, может подскажешь? Как с чекбоксами в DBGrideh работать (ADO, ACCESS)? На форумах везде реально, одни гипотезы, ни одного рабочего примера. Чтоб выбранные строки — выделенные галочками в DBGridEh, переносились в другой DBGRidEh.

    • Andrey53:

      На сколько я знаю, результат, выделенной галочки в таблице храниться как True False, на это и необходимо проверять данное поле, но так как под рукой нету у меня этого компонента, то точно сказать не могу, постараюсь в ближайшее время рассмотреть данную тему

  4. zerdalert:

    Спасибо большое. Было бы очень интересно.

  5. […] Ну, а теперь, выборка записей, у которых установлен флажок. Для этого, мы частично, воспользуемся статьей. […]

  6. Вадим:

    https://www.youtube.com/watch?v=FeNlT4gtCg0 — Организация поиска по записям базы данных

  7. Дмитрий:

    Вопрос такой. Скачал исходник по ADOsqldat скомпилировал, в коде ошибка. Вы сами проверяли работоспособность приложения? Там параметр data не не найден. Я потерял уйму времени ломая голову в чем проблема у меня в коде программы, оказывается исходник рукосракий

  8. альма:

    Здраствуйте. у меня.такой вопрос. на dbgrid не
    отображает данные таблицы.в таблице стоит слово memo1, memo2

  9. альма:

    Здраствуйте. у меня.такой вопрос. на dbgrid не
    отображает данные таблицы.в таблице
    стоит слово memo1, memo2. соединила дельфи
    + sql server manag.studio. помогите.срочна нужна

Оставить комментарий на Ping

Вы можете использовать следующие теги:

*