Некоторые особенности работы в C++ с InterBase(FireBird)

ВНИМАНИЕ: Код приведен для Borland C++ Builder 6. Автор не гарантирует работоспособность этого кода в других средах.

Если ты уже понял как связывать ADO и InterBase(FireBird) и тебе этого оказалось мало, то мы представляем еще один материал, связанный именно с рядом особенностей работы с этой БД.

Первое, что нам показалось странным то, что делая выборку через Select, не работает параметр Limit, такой привычный тебе и нам по MySQL. На таблице в 20 строк он особенно, то и не нужен, но когда у тебя около 50000+ строк - хотелось бы делать небольшую выборку для теста. В частности, мы делали экспорт в XML некоторой базы. И нам для теста нужна была сотня записей, чтобы проверить, все ли нормально отрабатывает.

Оказалось, что нет такой инструкции Limit, но взамен есть ROWS. Действует также как и Limit. По крайней мере если ему пишешь ROWS 20, то выборка будет первых 20 записей.

Примечание: Ага! Опять сказал А без Б, ну что за человек?! Лишить его премии. Значит объясняю - Limit это инструкция, которая позволяет устанавливать лимит на выборку. Пример такой: Select * from Алфавит Limit 20,10; Первая цифра указывает на количество записей для выборки, а вторая начиная с какой записи эту выборку делать. Еще раз. Если у тебя есть набор данных в формате (номер записи, данные): БД Пример [(1, А)(2, Б)(3, В)], то запрос Select * from Пример Limit 2,1; выдаст А, Б. Если же Select * from Пример Limit 2,2; то запрос вернет Б,В. Просто и удобно. В случае с ROWS автор не тестировал, будет ли работать второй параметр как с Limit. Безответственно подошел.

Второе заключается в том, что на некоторых машинах по непонятной причине ROWS не работает. Ситуация следующая - на компьютере на котором ведется разработка, все отрабатывает отлично. Приносишь на машину заказчика, вылетает ошибка, что невозможно выполнить инструкцию ROWS по причине незнания данной инструкции. И это при том, что у тебя и у машины заказчика стоят одинаковые сервер БД и коннектор FireBird. Одинаковые версии, одинаковая установка, а не работает. Это очень странно, но мы пробовали менять используемые диалекты, переустанавливать сервер БД, коннектор и ничего из этого не решило проблемы. Выход простой - протестировав нужные нам параметры выгрузки, мы убрали ROWS и отдали заказчику.

И просится еще третье. Раз просится, значит сейчас напишем. Работа с датой. База была спроектирована не нами, поэтому править ее не рекомендовалось и особенно лезть туда нельзя было. А нам этого и не надо было. Нам дали структуру и этого было вполне достаточно. Дата в нужном нам поле была в полном формате - дд.мм.гггг чч:мм:сс. А нам нужно было получить мм-дд-гггг. Первая мысль - использовать CAST. CAST не сработало. Бросить бы на этом задумку, но деньги заказчика творят чудеса. Поэтому прочитав немножко документации по серверу БД FireBird, было выяснено как вытащить дату. При том, что нормального примера не было, часть времени было потрачено на выявление работоспособного варианта инструкции Extract.

SQL-запрос

ADOQuery1->SQL->Text="SELECT EXTRACT(YEAR from BASE_MAIN.DATE) as YEARDATE, EXTRACT(MONTH from BASE_MAIN.DATE) as MONTHDATE,EXTRACT(DAY from BASE_MAIN.DATE) as DAYDATE from BASE_MAIN;";

Код

AnsiString st_date, st_day, st_month, st_year;
FILE *f;
f = fopen("dates.txt","w");
while(!ADOQuery1->Eof){
st_year = ADOQuery1->FieldByName("YEARDATE")->AsString;
st_month = ADOQuery1->FieldByName("MONTHDATE")->AsString;
st_day = ADOQuery1->FieldByName("DAYDATE")->AsString;
st_date = ""+st_month+"-"+st_day+"-"+st_year+"\n"; f
printf(f,st_date);
}
fclose(f);

Получив дату в свои руки ты можешь делать с ней, что угодно и как угодно. Механизм налажен, осталось его приложить к реальной задаче. Часы, минуты и секунды мы не проверяли, но думаем это будет HOUR, MINUTE и SECOND соответственно.

На этом пожалуй все из ярких непонятностей с которыми мы столкнулись. Приятной работы;)




Ссылки:

К содержанию

© Copyright 2004-2017 - CMS Made Simple
Сайт работает на CMS Made Simple version 1.4.1

© Все печеньки Break-people.ru принадлежат авторам проекта.

Яндекс цитирования Рейтинг@Mail.ru Яндекс.Метрика