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

 
Поиск в записей по дате из приложения
Миshук
Отправлено: 09.10.2005, 18:10


Дежурный стрелочник

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



СУБД — SQL Serever 2000
На форме три компанента JvEdit и один JvDateEdit. JvEdit для ФИО,а JvDateEdit для даты рождения. При нажатии кнопки берутся значения из этих компанентов и формируется текст запроса для набора данных.
С ФИО все понятно, а вот как мне дату в запрос вставить. Вот код:
CODE

void __fastcall TFQueryPacient::JvBitBtn1Click(TObject *Sender)
{
    AnsiString Str;
    Str="select * from MedicalInspection where ";
    if(JvEdit2->Text!="")Str=Str+"LastName LIKE' "+JvEdit2->Text+"%'and ";
    if(JvEdit3->Text!="")Str=Str+"Name LIKE' "+JvEdit3->Text+"%'and ";
    if(JvEdit4->Text!="")Str=Str+"FatherName LIKE' "+JvEdit4->Text+"%'and ";
**** if(JvDateEdit1->Text!="  .  .    ")Str=Str+"DayOfBirth=' "+JvDateEdit1->Date+" 'and ";
  .................
....................
....................и  т.д.
           
}

Вся проблема в том как мне значение даты в строчку запроса засунуть?
То что выделено **** — это чуш какая-то!!! В самой СУБД поиск по дате осуществляется вообще в формате гггг.мм.дд а не в дд.мм.гггг как в JvDateEdit. Думал использовать функции SQL Server, а там функции работают с частями даты — или 'гггг' или 'дд' или 'мм'. Может что-нибудь подскажите? Как всетаки мне дату в запрос вложить? Заранее спасибо!

Отредактировано olegenty — 10/10/2005, 06:43
olegenty
Отправлено: 10.10.2005, 05:43


Ветеран

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



пользуйся параметрическими запросами. в поиск...
gvg
Отправлено: 10.10.2005, 12:33


Машинист паровоза

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



QUOTE (Миshук @ 09/10/2005, 18:10)
**** if(JvDateEdit1->Text!=" . . ")Str=Str+"DayOfBirth=' "+JvDateEdit1->Date+" 'and ";

Я использую так
CODE

Str=Str+"DayOfBirth=' "+JvDateEdit1->Date->FormatString("yyyymmdd")+" 'and ";
olegenty
Отправлено: 10.10.2005, 12:41


Ветеран

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



если можно НЕ ИСПОЛЬЗОВАТЬ динамическоге формирование строки запроса, то его НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ. в данном случае нужно воспользоваться параметрическим запросом с четырьмя параметрами.
Миshук
Отправлено: 10.10.2005, 14:15


Дежурный стрелочник

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



[QUOTE] если можно НЕ ИСПОЛЬЗОВАТЬ динамическоге формирование строки запроса, то его НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ. в данном случае нужно воспользоваться параметрическим запросом с четырьмя параметрами.


Приходится использовать динамическое формирование строки т.к. использую один набор данных для:
1) Вставки записей в таблицу
2) Запроса записей из этой таблицы
Подумал над параметирческим запросом и родилось вот что!
Что если использовть в комбинации и динамическое формирование строки и параметрический запрос? Может это тупо?
(Работает нормально) Вот код -

[CODE]
void __fastcall TFQueryPacient::JvBitBtn1Click(TObject *Sender)
{
AnsiString Str;
Str="select * from MedicalInspection where ";
................................................
................................................
if(JvDateEdit1->Text!=" . . "){DM->qMI->Parameters->CreateParameter("PDayOfBirth",ftDateTime,pdInput,-1,NULL);Str=Str+"DayOfBirth=:PDayOfBirth and ";}
......................
.....................
DM->qMI->Close();
DM->qMI->SQL->Clear();
DM->qMI->SQL->Add(Str);
DM->qMI->Parameters->ParamByName("PDayOfBirth")->Value=JvDateEdit1->Date;
DM->qMI->Open();
....................
....................и т.д.

}

Так можно, или это глупо??? Важно знать ваше мнение!!!!

Отредактировано Миshук — 10/10/2005, 14:22
olegenty
Отправлено: 10.10.2005, 14:38


Ветеран

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



блин. ну так я тоже один наследник TDataSet использую для выборок/вставки/обновления/удаления. ну и что? в данном конкретном случае можно обойтись одним параметрическим SELECT с четырьмя параметрами. в крайнем случае — оформить его в хранимую процедуру, где в зависимости от комбинации параметров будет выполняться та или иная инструкция. весь фокус в том, что при динамическом формировании запроса на клиенте, запрос будет КАЖДЫЙ РАЗ подготавливаться сервером (Prepare). В то время как при использовании параметрического запроса подготовка запроса сервером будет выполняться всего разик. первый (на самом деле это ещё зависит от СУБД, кривизны рук проектировщика БД и т.д., но в общем правильном случае — первый). опять же, это только кажется, что подготовка запроса занимает мало времени (а зависит от СУБД, инструкции, нагруженности сервера БД...).

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