Новичок |
Отправлено: 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
|
Спасибо !!!!!!!! |
|