Сохранение QPixmap в базе данных
От: tiam Россия  
Дата: 16.11.06 21:05
Оценка:
Всем привет! Натолкнулся на грабли — ну жно сохранить QPixmap (Qt4) в базе данных как OLE объект.
В поиске нашел много подбного, но такого к сажелению не было
Если с загрузкой из базы проблем нет (просто пропускается OLE-заголовок), то с сохранением выходит сложнее. Вот я докопал до этого, на знаю правильно ли это.

QString textQuery = "INSERT INTO Employees (FirstName, LastName, Date_of_birth, Phone, Address, Photo) "
            "VALUES (:FirstName, :LastName, :Date_of_birth, :Phone, :Address, :Photo)";
query.prepare(textQuery);
query.bindValue(":FirstName", firstName);
query.bindValue(":LastName", lastName);
query.bindValue(":Date_of_birth", dateBirth);
query.bindValue(":Phone", phone);
query.bindValue(":Address", address);
QPixmap *photo = photoLabel->pixmap();
if (photo && !photo->isNull()) {
    PICTDESC describe;
    describe.bmp.hbitmap = photo->toWinHBITMAP();
    describe.bmp.hpal = QColormap::hPal();
    describe.picType = PICTYPE_BITMAP;
    describe.cbSizeofstruct = sizeof(PICTDESC);
    LPPICTURE lpPicture = NULL;
    HRESULT hr = OleCreatePictureIndirect(&describe, IID_IPicture, true, (void **) &lpPicture);
    if(SUCCEEDED(hr) && (lpPicture != NULL)) {
            // тут необходимо перевести IPicture (lpPicture) в QByteArray (dataPhoto)
        query.bindValue(":Photo", dataPhoto);
.......

query.exec();


В общем надо из IPicture получить указатель на массив (OLE-рисунок) и его длину, чтоб затем запихнуть его в QByteArray.

20.01.10 20:25: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Сохранение QPixmap в базе данных
От: Tonal- Россия www.promsoft.ru
Дата: 17.11.06 05:08
Оценка:
Эк тебя заколбасило!
Открываем MSDN, и читаем про IPicture:

...
The picture object also supports IPersistStream so it can save and load itself from an instance of IStream.
...


P.S. А почему именно OLE-объекты? Чем не устраивает родная Qt-шная сериализация?
Или эту базу из VB кто-то мучает?
Re[2]: Сохранение QPixmap в базе данных
От: tiam Россия  
Дата: 17.11.06 12:47
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Эк тебя заколбасило!

T>Открываем MSDN, и читаем про IPicture:
T>

T>...
T>The picture object also supports IPersistStream so it can save and load itself from an instance of IStream.
T>...


Ну вот сделал так — не работает. Записывает в буфер какую-то муть. Что я делаю не так?

            PICTDESC describe;
            memset(&describe, 0, sizeof(describe));
            describe.cbSizeofstruct = sizeof(describe);
            describe.bmp.hbitmap = photo->toWinHBITMAP();
            describe.bmp.hpal = QColormap::hPal();
            describe.picType = PICTYPE_BITMAP;
            LPPICTURE pPicture = 0;
            HRESULT hr = ::OleCreatePictureIndirect(&describe, IID_IPicture, true, (void **) &pPicture);
            if(SUCCEEDED(hr) && (pPicture != NULL)) {
                IStorage* pStg = 0;
                hr = ::StgCreateDocfile(NULL, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStg);
                if(SUCCEEDED(hr)) {
                    IStream* pStream = 0;
                    pStg->CreateStream(L"PICTURE", STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &pStream);
                    IPersistStream *pPersistStream;
                    if (SUCCEEDED(pPicture->QueryInterface(IID_IPersistStream, (void**)&pPersistStream))) {
                        pPersistStream->Save(pStream, false);
                        ULARGE_INTEGER pcbSize;
                        if(SUCCEEDED(pPersistStream->GetSizeMax(&pcbSize))) {
                            ULONG sizeData = pcbSize.QuadPart;
                            char *data = new char[sizeData];
                            HRESULT hr = pStream->Write(data, sizeData, &sizeData);
                            if (SUCCEEDED(hr)) {
                                QByteArray dataPhoto(data, sizeData);
                                query.bindValue(":Photo", dataPhoto);
                            }


T>P.S. А почему именно OLE-объекты? Чем не устраивает родная Qt-шная сериализация?

T>Или эту базу из VB кто-то мучает?

При открытии в Акцесе рисунки не отображаются, если сохранить просто как бинарные данные.
Re[3]: Сохранение QPixmap в базе данных
От: Tonal- Россия www.promsoft.ru
Дата: 17.11.06 14:43
Оценка:
Может вмепсто StgCreateDocfile + CreateStream просто CreateStreamOnHGlobal?

P.S. А очень нужно именно в Ацесе открывать?
Re[4]: Сохранение QPixmap в базе данных
От: tiam Россия  
Дата: 17.11.06 17:24
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Может вмепсто StgCreateDocfile + CreateStream просто CreateStreamOnHGlobal?


T>P.S. А очень нужно именно в Ацесе открывать?


Да, так и сделаю (без возможности отображения в Акцесе) , а то у меня начала уже крыша ехать от всех этих наворотов с интерфейсами .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.