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

 Здравствуйте, гость ( Вход | Регистрация )   Скачать форум | Поиск по Форуму | Участники | Помощь
 Поиск по:   сайтy   
   архиву форума   
  ОтветитьНовая тема
Запрос с датой в ADO, несоответствие типов данных
« предыдущая тема | следующая тема » Подписаться на тему | Отправить тему на E-mail | Распечатать тему
Maxidrom
Отправлено: 18.03.2007, 19:24 Цитировать


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


Группа: Участник
Сообщений: 5
Пользователь № 3787
Регистрация: 18.01.07



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

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

ADOQuery->Open;

Выдает ошибку несоответствие типов данных в условии отбора
 
Послать сообщение E-mail адрес  Top
Tantos
Отправлено: 19.03.2007, 08:30 Цитировать


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


Группа: Участник
Сообщений: 108
Пользователь № 2982
Регистрация: 15.11.06



Используй параметризованный запрос:
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

--------------------
Чем больше узнаю людей, тем больше люблю компьютеры.
 
Послать сообщение ICQ  Top
** Joker
Отправлено: 20.03.2007, 02:11 Цитировать


Unregistered









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


Unregistered









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#
 
Top
olegenty
Отправлено: 20.03.2007, 13:58 Цитировать


Ветеран


Группа: Модератор
Сообщений: 2412
Пользователь № 507
Регистрация: 13.02.04



там не автоопределение, там тупое присваивание варианту, и присваивать надо дату, а не строку.

--------------------
Управлять можно лишь тем, что можно измерить.
Восточная мудрость.
 
Послать сообщение E-mail адрес ICQ  Top
** Joker
Отправлено: 22.03.2007, 01:08 Цитировать


Unregistered









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

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

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


Ветеран


Группа: Модератор
Сообщений: 2412
Пользователь № 507
Регистрация: 13.02.04



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

CODE

select
     Field1
   , Field2
from
   SomeTable
where
   SomeDateTimeField = :DateParam

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

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


и строки тут не при чём.

--------------------
Управлять можно лишь тем, что можно измерить.
Восточная мудрость.
 
Послать сообщение E-mail адрес ICQ  Top
AVC
Отправлено: 22.03.2007, 09:30 Цитировать


Ветеран


Группа: Модератор
Сообщений: 1583
Пользователь № 655
Регистрация: 19.05.04



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#
 
Послать сообщение E-mail адрес ICQ  Top
Guest
Отправлено: 23.03.2007, 02:51 Цитировать


Unregistered









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

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

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

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


Ветеран


Группа: Модератор
Сообщений: 2412
Пользователь № 507
Регистрация: 13.02.04



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

--------------------
Управлять можно лишь тем, что можно измерить.
Восточная мудрость.
 
Послать сообщение E-mail адрес ICQ  Top
Maxidrom
Отправлено: 24.03.2007, 19:41 Цитировать


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


Группа: Участник
Сообщений: 5
Пользователь № 3787
Регистрация: 18.01.07



Я сделал вот так
ADOQuery->SQL->Add("Select * From Expense Where DateExpense Between DateValue('" +
FormatDateTime("dd/mm/yyyy",DTPReportFrom->Date) + "') And DateValue('" +
FormatDateTime("dd/mm/yyyy",DTPReportTo->Date) + "')" );
 
Послать сообщение E-mail адрес  Top
10 ответов с: 18.03.2007, 19:24 Подписаться на тему | Отправить тему на E-mail | Распечатать тему

Back to Работа с базами данных в C++Builder
ОтветитьНовая тема