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

 
работа с JPEG в ACCESS, чтение и запись JPEG-файлов в БД
Новичок
Отправлено: 12.04.2005, 11:22


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







Помогите пожалуйста!

Необходимо произвести чтение из и запись в БД Access, графической информации (рисунок в формате JPEG), используя BDE. (по возможности)

Пользуюсь "Запросами", для выбора информации из бд.

Посоветуйте, что мне лучше использовать (какие компоненты, функции и т.д.) для реализации задачи?

Заранее благодарен.
AVC
Отправлено: 12.04.2005, 12:01


Ветеран

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



TBlobField для чтения (при любой выборке) или для записи, при простой выборке.

TParam — Blob при работе через параметры.
Loads the value of a BLOB parameter from the specified file.
void __fastcall LoadFromFile(const AnsiString FileName, Db::TBlobType BlobType);

Пример работы приводил тут Blob InterBase, Вставить картинку
Новичок
Отправлено: 13.04.2005, 10:02


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







Спасибо за совет!

Появился друго вопрос.

Этим кодом я пытаюсь записать в БД (Access), в поле "pict" типа "Поле объекта OLE", картинку в формате JPEG.

CODE

 DD->Query1->Close();
 DD->Query1->SQL->Clear();
 DD->Query1->SQL->Add("INSERT INTO tab (kod, pict) VALUES(:kod, :pict)");
 DD->Query1->ParamByName("kod")->AsInteger=kk;
 DD->Query1->ParamByName("pict")->LoadFromFile(PicBox->FileName, ftBlob);
 DD->Query1->ExecSQL();


После чего в поле записываются какие-то данные (которые в БД выглядят как "Двоичные данные"), при попытке их просмотреть возникает "ошибка при установлении связи в приложении ACCESS с сервером OLE".

Это нормальное явление? И смогу ли я потом прочитать из БД эти данные, и просмотреть их через компонент TImage, в том виде в котором они были до записи их в БД?

Пожалуйста ответьте !!!
AVC
Отправлено: 13.04.2005, 10:38


Ветеран

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



QUOTE
После чего в поле записываются какие-то данные (которые в БД выглядят как "Двоичные данные")

Картинка это и есть двоичные данные.
Если поставить тип поля Memo все станет намного проще.
Для просмотра в TImage, скорее всего, надо будет еще зарегистрировать jpeg. Как это сделать — поищите на форуме.
Новичок
Отправлено: 13.04.2005, 12:31


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







Кстати строка:

CODE

DD->Query1->ParamByName("pict")->LoadFromFile(PicBox->FileName, ftBlob);


говорит о том, что я пишу в БД саму картинку или же путь на диске к файлу, содержащему эту картинку?
Тогда я так понимаю, если это так, то мне надо будет загружать эту картинку уже с диска на основе "пути", который я получу из БД?

Или же я не прав? Тогда получится, что мне необходимо будет считать в память из БД двоичные данные, в виде строки, затем преобразовать их в формат JPEG, и вывести на просмотр в TImage. Я правильно понимаю или нет?
AVC
Отправлено: 13.04.2005, 12:45


Ветеран

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



QUOTE

Use LoadFromFile to set the value of a BLOB parameter from a value stored in the file specified by the FileName parameter.

Следовательно саму картинку.
Поэкспериментируйте, для начала, с bmp. Многие вопросы отпадут.
Новичок
Отправлено: 13.04.2005, 14:30


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







С тем что пишется в БД я разобрался, Спасибо!!!

Возникли проблемы при чтении картинок из БД и просмотре их в TImage. Пробовал два варианта.

В первом варианте в строке
CODE
Image1->Picture->Assign((TPersistent*)Buf)
, генерируются следующие исключениея:
- при попытке вывести на просмотр JPEG размером 352 kb — "BLOB not opend";
- при попытке вывести на просмотр JPEG 40 kb или BMP 1,37 Mb — "Access violation at address ... . Read of address ...";
В чем причина генерации ошибки?
CODE

int M_S;
char *Buf;
TBlobStream *St;
 while (!DD->Query1->Eof)
    {     if (StrToInt(DD->Query1->FieldByName("kod")->AsString)==k_d)
             St = new TBlobStream((TBlobField *)DD->Query1->FieldByName("pict"), bmRead);
     DD->Query1->Next();    }
try
 {
     M_S = St->Size + 1;
     Buf = new char[M_S];
       try
        {
            St->Read(Buf, M_S);
            Image1->Picture->Assign((TPersistent*)Buf);
        }
      catch (...)
       {
           delete Buf;
           throw;
       }
    delete Buf;
 }
catch (...)
 {
   delete St;
   throw;
 }
 delete St;


Во втором варианте исключения не генерируются, но и картинка не выводится в TImage:
CODE

TMemoryStream* mPs = new TMemoryStream();
 DD->Query1->Close();
 DD->Query1->SQL->Clear();
 DD->Query1->SQL->Add("SELECT pict FROM tab WHERE kod=:kk");
 DD->Query1->ParamByName("kk")->AsInteger=k_d;
 DD->Query1->Open();
 mPs->LoadFromStream(DD->Query1->CreateBlobStream(DD->Query1->FieldByName("pict"), bmRead));
 Image1->Picture->Assign((TPersistent*)mPs);

Помогите пожалуйста !!!
avc*
Отправлено: 13.04.2005, 15:09


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







А с bmp работает?

QUOTE (AVC @ 13/04/2005, 10:38)
Для просмотра в TImage, скорее всего, надо будет еще зарегистрировать jpeg. Как это сделать — поищите на форуме.

Новичок
Отправлено: 14.04.2005, 09:53


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







Попробовал поработать с BMP, картинка считывается и вставляется в TImage, только она обрезается самым жестоким образом, остается где-то 1/20 часть, а может и меньше, от полной картинки, остальное закрашивается черным. Что это может быть.
Использую следующий код:

CODE

Graphics::TBitmap *Bit = new Graphics::TBitmap();

 DD->Query1->Close();
 DD->Query1->SQL->Clear();
 DD->Query1->SQL->Add("SELECT pict FROM tab WHERE kod=:kk");
 DD->Query1->ParamByName("kk")->AsInteger=k_d;
 DD->Query1->Open();
 Bit->Assign(DD->Query1->FieldByName("pict"));
 Image1->Picture->Bitmap->Assign(Bit);
olegenty
Отправлено: 14.04.2005, 10:15


Ветеран

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



Качни уже ImageLib Corporate Suite с этого сайта, он понимает ВСЁ, или почти всё. Кроме того, умеет автомасштабировать картинку на выводимую область и ещё очень много чего полезного. Оч. удобно. Пользуюсь и доволен. Пользуюсь именно для хранения картинок (эскизов) в базе данных.
Новичок
Отправлено: 14.04.2005, 11:47


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







А ссылочку нельзя дать? А то я весь, или почти весь, сайт облазил, но так и не нашел, представляете.

Буду очень признателен.
AVC
Отправлено: 14.04.2005, 11:51


Ветеран

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



Регистритесь и сюда
C++ Builder ->Закрытый форум для постоянных участников ->Компоненты VCL
НовичокЧок
Отправлено: 14.04.2005, 13:04


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

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



А где взять пароль для входа в "закрытый форум для постоянных участников" или его заслужить надо?
AVC
Отправлено: 14.04.2005, 13:13


Ветеран

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



C++ Builder ->Работа сайта ->Обсуждение работы форумов -> Пароль для входа на закрытые форумы
НовичокЧок
Отправлено: 14.04.2005, 13:48


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

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



Спасибо !!!!!!!!

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