Использование изображений и данных с полями BLOB в C ++ Builder - PullRequest
1 голос
/ 09 февраля 2010

Я программист C ++, использующий Borland C ++ Builder 5. Я работаю над приложением базы данных и это вызывает у меня серьезное горе прямо сейчас ...

Я использую таблицу Paradox 7.0 вместе с C ++ Builder и просто не могу найти способ вставить данные в BLOB. Я также не могу сохранять или просматривать изображения с использованием компонента VCL TDBImage. Моя последняя попытка сорвала попытки сохраните изображение в поле BLOB, используя то, что кажется железным фрагментом кода.

//-----------------------------------------
Table1->Edit();
Open->Execute();
String file=Open->FileName;
ShowMessage(file);

TBlobField *blob; blob=new (TBlobField);

blob->FieldName="Image";
blob->LoadFromFile(file);

Table1->Post();
//-----------------------------------------

При компиляции этого кода произошел сбой, указав, что BlobField не имеет функции динамического выделения объектов или чего-то в этом роде.

Я также не могу ни добавить контроллер OCX для компонента OLE2, ни сохранить его в собственном поле BLOB.

Пожалуйста, кто-нибудь, приходите ко мне на помощь

: '(

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Одна вещь, которая поразила меня, была ваша линия:

TBlobField *blob; blob=new (TBlobField);

Прежде всего, я не уверен, почему вы используете этот синтаксис вместо:

TBlobField *blob = new TBlobField;

Во-вторых, конструктор TBlobField принимает один аргумент - указатель на TComponent, который действует как владелец объекта и является объектом, ответственным за очистку памяти впоследствии. Вы можете попробовать сделать следующее:

TBlobField *blob = new TBlobField(Table1);

Должен признать, что я не слишком много занимался программированием баз данных в C ++ Builder, однако вышеприведенное должно работать.

Редактировать: Еще одна вещь, однако, то, как вы используете TBlobField, никогда не ассоциируется с таблицей. Вы можете найти эту статью на about.com: Хранение записей в поле BLOB [1] . Он написан на Delphi, но должен легко переноситься на C ++ благодаря инфраструктуре VCL.

Вы можете попытаться использовать следующее вместо этого, хотя оно не проверено, поэтому вы можете столкнуться с некоторыми проблемами при этом, если это так, скажите мне:

TField *field = Table1->FieldByName("image");
TBlobField *blob = dynamic_cast<TBlobField *>(field);
if (blob)
{
    blob->LoadFromFile(file);
}

[1] http://delphi.about.com/od/database/a/record2blob.htm

0 голосов
/ 27 мая 2011

В Delphi есть функция TDataSet.CreateBlobStream. Из-за некоторых проблем, возникших в Delphi 7, мне пришлось пойти по этому же пути точно для того же приложения, храня изображения в поле парадоксального блоба. Смотрите эту ссылку для получения дополнительной информации (к сожалению, Delphi):

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_CreateBlobStream.html

...