Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка по формату даты 
:(
    Опции темы
SkyHawk
Дата 11.5.2007, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Здравствуйте.
Такая проблема. Выполняю сортировку по выбранному полю посредством SQL-запроса (оператор ORDER BY) в базе данных Access через компонент ADOQuery (Builder). Запрос формирую так: если поле текстового формата, то в запрос добавляю кавычки, если числового, то кавычки не добавляю. А вот если формат "Дата", то вылетает EOleException: "Несоответствие типов данных в выражении условия отбора", хоть ставлю кавычки, хоть нет. Как можно побороть данную неприятность? 

--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Rodman
Дата 11.5.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



тебе через параметры нужно делать. так эффективнее...

но без кода проги трудно судить о правильности твоих действий...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
bas
Дата 11.5.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: нет
Всего: 2



Цитата(SkyHawk @  11.5.2007,  06:11 Найти цитируемый пост)
хоть ставлю кавычки, хоть нет. Как можно побороть данную неприятность? 

А #01/10/2007# не пробовал ставить?
Код

При указании аргумента условиеОтбора литералы даты (символы дат) должны вводиться в 
американском формате, даже если используется неамериканская версия ядра базы данных Jet. 
Например, дата 10 мая 1996 года записывается в России как 10.05.96, а в США как 5/10/96. 
Обязательно заключите даты в символы «решетки» (#), как показано в следующих примерах.

Для отбора записей с этой датой в российской базе данных необходимо использовать следующую 
инструкцию SQL:

SELECT *

FROM Заказы

WHERE ДатаИсполнения = #5/10/96#;


Кроме того, можно применять функцию DateValue, которая поддерживает международные стандарты,
заданные в Microsoft Windows®. Например, для отбора записей в американской базе данных создайте 
текст программы:

SELECT *

FROM Заказы

WHERE ДатаИсполнения = DateValue('5/10/96');


Для российской базы данных текст программы будет выглядеть так:

SELECT *

FROM Заказы

WHERE ДатаИсполнения = DateValue('10.5.96');

PM MAIL   Вверх
SkyHawk
Дата 11.5.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



bas,  спасибо большое! Респект и уважуха.  smile 

Rodman, а по-поводу параметризированных запросов...  Пробовал, не катит. Создал в свойстве Parameters компонента ADO1 два параметра: PoleSort и Text. В обработчике кнопки выполняю следующий код:

Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  ADO1->Close();
  ADO1->Parameters->ParamByName("PoleSort")->Value=PoleSort;
  ADO1->Parameters->ParamByName("Text")->Value=ComboBox1->Text;
  ADO1->SQL->Strings[1]="where :PoleSort=:Text";
}



На что мне вылетает EDataBaseError ошибка: "Parameter 'PoleSort' not found". Причем вылетает при нажатии на кнопку, хотя при трассировке выполнение не доходит даже до первой строки приведенного выше кода. То есть, как я понимаю, выполняется проверка на наличие параметра, и не находит данный параметр. Но почему - я ведь создал его в свойстве Parameters?
Не понимаю...
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Anikmar
Дата 11.5.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(SkyHawk @  11.5.2007,  10:15 Найти цитируемый пост)
Но почему - я ведь создал его в свойстве Parameters?

Лучше не использовать динамический запрос. - Введите в свойство SQL сразу строку where :PoleSort=:Text и уберите из программы строку
ADO1->SQL->Strings[1]="where :PoleSort=:Text";

Причина: Если вы создаете параметры вручную, а потом меняете запрос, то компонент не всегда может определить тип параметра. Если вы сразу задали запрос с параметрами, в компоненте есть отдельное свойство (не помню как называется), оно отвечает за автоматический разбор строки запроса и выделение параметров. При изменении запроса в дизайн-тайме он может отследить это изменение.
При изменении текста запроса программно - нет, надо вручную указывать.
Может я немного ошибаюсь, но с такими проблемами сталкивался, и понял, что никакого смысла нет задавать текст запроса программно (именно в данном и похожем на него случаях).

При работе с датами параметризированный запрос однозначно более универсален и работает устойчивей - так как сам определяет формат данных.



PM MAIL ICQ   Вверх
bas
Дата 12.5.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: нет
Всего: 2



Цитата(Anikmar @  11.5.2007,  18:43 Найти цитируемый пост)
не помню как называется

ParseSQL этот метод есть у Params нашего Query.

PM MAIL   Вверх
Anikmar
Дата 12.5.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(bas @  12.5.2007,  14:52 Найти цитируемый пост)
ParseSQL этот метод есть у Params нашего Query.

Не. Я имел в виду свойство ParamCheck. 

В общем динамический запрос с параметрами штука достаточно капризная.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.