C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запрос с датой в ADO, несоответствие типов данных
Maxidrom
Отправлено: 18.03.2007, 19:24


Ученик-кочегар

Группа: Участник
Сообщений: 5



Помогите пожалуйста.
База данных Access, использую ADO. Делаю SQL запрос

ADOQuery->SQL->ADD("Select * from AAAA where DateReceipt =' " +
DateTimePicker->Date.DateString() + " ' ");

ADOQuery->Open;

Выдает ошибку несоответствие типов данных в условии отбора
Tantos
Отправлено: 19.03.2007, 08:30


Станционный диспетчер

Группа: Участник
Сообщений: 108



Используй параметризованный запрос:
CODE

ADOQuery->SQL->Clear();
ADOQuery->SQL->ADD("Select * from AAAA where DateReceipt=:D1");
ADOQuery->ParamByName("D1")->AsDate = DateTimePicker->Date;


P.S. A ты чисто ради интереса не пробовал посмотреть, ЧТО у тебя получается за текст запроса? Что-то мне подсказывает, что все дело в том, КАК ты формируешь запрос . rolleyes.gif

Отредактировано Tantos — 19.03.2007, 15:30
** Joker
Отправлено: 20.03.2007, 02:11


Не зарегистрирован







При работе через параметры вроде как производится автопреобразование типов, но я всё же использую
DateToStr(DateTimePicker1.Date)
Guest
Отправлено: 20.03.2007, 09:15


Не зарегистрирован







QUOTE (** Joker @ 20.03.2007, 02:11)
При работе через параметры вроде как производится автопреобразование типов, но я всё же использую
DateToStr(DateTimePicker1.Date)

А вы уверены что DateToStr преобразует к строке, подходящей для Access wink.gif
Access хочет видеть дату такой строкой
Дата #mm/dd/yyyy#
Время #hh.nn.ss#
Дата и время #mm/dd/yyyy hh.nn.ss#
olegenty
Отправлено: 20.03.2007, 13:58


Ветеран

Группа: Модератор
Сообщений: 2412



там не автоопределение, там тупое присваивание варианту, и присваивать надо дату, а не строку.
** Joker
Отправлено: 22.03.2007, 01:08


Не зарегистрирован







2olegenty: Интересно знать, как вы вставляете дату в формате даты в SQL-запрос, который всю жизнь был текстом biggrin.gif

2Guest: Тогда 2 варианта
1) Добавьте в OnFormCreate: DateTimePicker1.Format:='mm.dd.yyyy' (минус: если вручную вводить дату в датапикер, можно перепутать)
2) Добавьте тоже самое перед выполнением скрипта, а после верните к нормальному виду: DateTimePicker1.Format:='dd.mm.yyyy'

Второй вариант предпочтительнее, мне кажется.
olegenty
Отправлено: 22.03.2007, 08:09


Ветеран

Группа: Модератор
Сообщений: 2412



вот так вставляю:

CODE

select
     Field1
   , Field2
from
   SomeTable
where
   SomeDateTimeField = :DateParam

это св-во SQL. а далее
CODE

   Query->Parameters->ParamByName("DateParam")->Value = Now();


и строки тут не при чём.
AVC
Отправлено: 22.03.2007, 09:30


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (** Joker @ 22.03.2007, 00:08)
2olegenty: Интересно знать, как вы вставляете дату в формате даты в SQL-запрос, который всю жизнь был текстом biggrin.gif

2Guest: Тогда 2 варианта
1) Добавьте в OnFormCreate: DateTimePicker1.Format:='mm.dd.yyyy' (минус: если вручную вводить дату в датапикер, можно перепутать)
2) Добавьте тоже самое перед выполнением скрипта, а после верните к нормальному виду: DateTimePicker1.Format:='dd.mm.yyyy'

Второй вариант предпочтительнее, мне кажется.

From Guest
Оба варианта плохи + вы пропустили главное: безопасная константа типа дата в Access выглядит так #mm/dd/yyyy#, а вы пытаетесь подсунуть mm.dd.yyyy (с точностью до разделителей).

Зачем уродовать DateTimePicker1.Format когда это можно сделать прямо при построении текста запроса.

Вот так я (Guest) мог бы сформировать константный запрос с датой для Access
CODE

Есть что-то типа TDateTime (или TDate) пусть с именем dt.
TDateTime dt(2006, 02, 27);
ds->SQL->Text = AnsiString("")
+ "Select * From Test "
+ " Where dati = "
+ FormatDateTime("'#'mm'/'dd'/'yyyy'#'", dt);

Готовый текст выглядит так
Select * From Test Where dati = #02/27/2006#
Guest
Отправлено: 23.03.2007, 02:51


Не зарегистрирован







2olegenty: Вот я и говорю, про автопреобразование типа. Т.к. Now возвращает дату в формате dd.mm.yyyy, но если такой запрос работает, значит она волшебным образом переформатируется в
#mm/dd/yyyy#

2AVC: Отчасти согласен. FormatSettings полезная вещь, но если запрос вызывается редко, то я бы предпочёл применять вариант который предложил... а по поводу моей ошибки в формате — никто не мешает написать DateTimePicker1.Format:='#mm/dd/yyyy#';

Ведь можно вообще создать переменную типа TFormatSettings, задавать ей необходимое значение и преобразовывать формат. (А еще можно всё это дело выделить в отдельную функцию).

В каждом конкретном случае необходимо пользоваться соответствующим вариантом реализации.
olegenty
Отправлено: 23.03.2007, 08:46


Ветеран

Группа: Модератор
Сообщений: 2412



Now возвращает дату БЕЗ ФОРМАТА. внутреннее представление даты — double. всё остальное — от лукавого.
Maxidrom
Отправлено: 24.03.2007, 19:41


Ученик-кочегар

Группа: Участник
Сообщений: 5



Я сделал вот так
ADOQuery->SQL->Add("Select * From Expense Where DateExpense Between DateValue('" +
FormatDateTime("dd/mm/yyyy",DTPReportFrom->Date) + "') And DateValue('" +
FormatDateTime("dd/mm/yyyy",DTPReportTo->Date) + "')" );

Вернуться в Работа с базами данных в C++Builder