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

 
Хранение картинок БД Firebird
Valdemar
Отправлено: 20.12.2005, 16:18


Мастер участка

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



Есть таблица, в одном из полей которой хранятся картинки. Запросом я выбираю нужные данные, включая поле с картинкой. Данные (кроме картинок) отображаются в DBGrid, а чтобы посмотреть картинку (если он есть) пользователь нажимает дополнительную кнопку. Свойство Enabled этой кнопки, а также кнопок Добавить и Удалить картинку, зависит от наличия картинки в поле БД.
Но при таком подходе картинки выбираются зарпросом из БД, но пользователю они могут и не понадобиться. А если в запросе не выбирать поле с картинкой, то как узнать есть ли картинка или нет, что-бы правильно задать свойство Enabled для кнопок Посмотреть, Дабавить и Удалить картинку?
Может быть можно написать запрос, который будет возвращать нужные данные, а вместо картинки будет выдан флаг наличия картинки, например, 1-есть картинка, 0-нет?
Можно написать храниую процедуру, которая будет выбирать из таблицы нужные данные, а вместо картинки 0 или 1, а запрос делать не к таблице, к этой ХП. Но может можно обойтись без хранимой процедуры?
olegenty
Отправлено: 20.12.2005, 18:40


Ветеран

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



однозначно необходимы 2 запроса:
1. запрос всех данных + флага наличия картинки
2. запрос картинки по идентификатору, который будет выполняться ТОЛЬКО если картинка ЕСТЬ, и ТОЛЬКО если пользователь ВОЗЖЕЛАЛ её увидеть.
Valdemar
Отправлено: 20.12.2005, 19:49


Мастер участка

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



В том-то и вопрос, как получить флаг наличия картинки?
Admin
Отправлено: 20.12.2005, 22:31


Владимир

Группа: Администратор
Сообщений: 1190



Добавьте в таблицу поле — 1 байт — флаг наличия картинки.
Тогда по 1 запросу всегда возвращайте данные в Grid без
картинок все, в поле где картинка сможете сразу отражать
ее наличие/отсутствие, а при клике (запросе) пользователем
определенной картинки во 2 запросе возвращайте именно
запрошенную картинку.
Можете это делать и через ХП, это уж как захотите.
Заодно уменьшите и нагрузку на БД, так как не придется
читать-передавать все картинки.
Valdemar
Отправлено: 21.12.2005, 08:40


Мастер участка

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



Дополнительное поле — тоже не плохая идея. Спасибо за совет.
olegenty
Отправлено: 21.12.2005, 08:54


Ветеран

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



по-моему дополнительное поле не нужно, вместо него лучше воспользоваться вьюхой, где одно поле будет расчётным: 0 — если поле картинки = NULL и 1 — в противном случае.
Valdemar
Отправлено: 21.12.2005, 10:13


Мастер участка

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



А как составить запрос для такого представления чтобы
QUOTE
одно поле будет расчётным: 0 — если поле картинки = NULL и 1 — в противном случае
olegenty
Отправлено: 21.12.2005, 11:31


Ветеран

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



думать надо, смотреть условные функции. на MSSQL это было бы WHEN CASE, а как на IB/FB — надо подумать, я с ним уже второй год не работаю.
olegenty
Отправлено: 21.12.2005, 11:32


Ветеран

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



лобовое решение — написать UDF. если средствами языка невозможно, я сделал бы именно так.
Valdemar
Отправлено: 21.12.2005, 13:02


Мастер участка

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



В Firebird я условных функций не нашел (кроме как в ХП и триггерах). Я больше склоняюсь к использованию хранимой процедуры.
Gedeon
Отправлено: 21.12.2005, 13:39


Ветеран

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



А что хранится в поле если там картинки нет, не NULL случайно?
Valdemar
Отправлено: 21.12.2005, 20:45


Мастер участка

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



Да, если картинки нет, то NULL
Valdemar
Отправлено: 21.12.2005, 21:20


Мастер участка

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



Gedeon, ваш вопрос натолкнул меня на хорошую мысль:
CODE
SELECT field1, field2, 1 flag_img FROM table WHERE img is not null
union
SELECT field1, field2, 0 flag_img FROM table WHERE img is null
Gedeon
Отправлено: 22.12.2005, 09:42


Ветеран

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



Ну именно для этого я его и задавал smile.gif .

Только мне кажется можно обойтись без юнион, щас нет под рукой хэлпа к файрбёрд, но мне кажется какой-нить каст или конверт там есть, должно сработать приведение к булеву типу.
Guest
Отправлено: 25.12.2005, 15:41


Не зарегистрирован







QUOTE
А как составить запрос для такого представления чтобы
QUOTE

одно поле будет расчётным: 0 — если поле картинки = NULL и 1 — в противном случае

Не указана версия сервера. Если 1.5 и далее со всеми остановками,smile.gif
(к чему, кстати не вижу препятствий), то:
1. (Field_With_Picture==NULL ? 0 : 1)
CODE

SELECT
   Field1,
   ...
   FieldN,
 CASE
    WHEN (Field_With_Picture IS NULL) THEN 0
    ELSE 1
 END
FROM
   YourTable


2. Не так, как в условии, но вдруг понадобится:
(Field_With_Picture==NULL ? 0 : picture_field )
CODE

SELECT
   COALESCE(Field_With_Picture, 0)
FROM
   YourTable


PS: читайте Firebird 1.5 Release Notes, там много интересного... smile.gif
Valdemar
Отправлено: 26.12.2005, 08:45


Мастер участка

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



Спасибо

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