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 ты чисто ради интереса не пробовал посмотреть, ЧТО у тебя получается за текст запроса? Что-то мне подсказывает, что все дело в том, КАК ты формируешь запрос .
Отредактировано 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
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-запрос, который всю жизнь был текстом
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-запрос, который всю жизнь был текстом
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) + "')" );
|
|