Новости

Робота з ADO в Delphi. частина 5

  1. Схожі записи

Ну що ж, вирішив згадати старе

Ну що ж, вирішив згадати старе. Якщо чесно, то не по своїй волі, а на прохання одного читача мого блогу, який попросив показати, як можна виконувати запити до БД MS Access і порівнювати в умови дати. За його словами у нього виникли проблеми при порівнянні дат (тобто по вибірці записів, за умовою дат), якщо тип поля в БД MS Access варто - Дата / Час, то з'являється приблизно помилки наступні:

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

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

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

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

У своєму проекті, я встановив наступні компоненти:

  • TADOConnection
  • TADOQuery
  • TButton

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

Відображення всіх відомостей, ми ніде не будемо, а просто, для перевірки виведемо їх в циклі, щоб просто переконатися, що наш запит виконаний правильно.

Ось така у мене структура вийшла моєї БД.

А ось приклад такого запиту, але не забувайте, що в БД 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 запис, що говорить про працездатність запиту і програми в цілому
У мене вивело 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)

Схожі записи

Мітки: Access , Ado , ADoconnection , AdoQuery , dbGo , MS Access , sql

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

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: