Russian Qt Forum
Ноябрь 27, 2024, 23:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Считывание изображений из базы данных  (Прочитано 6816 раз)
dsp
Гость
« : Июнь 12, 2011, 15:08 »

Есть база данных, которая хранит изображения и другую инфу.

Структура бд
Код:
model->setTable("photos");
    model->setHeaderData(0, Qt::Horizontal, "Id");
    model->setHeaderData(1, Qt::Horizontal, "Photo");    
    model->setHeaderData(2, Qt::Horizontal, "File_Name");
    model->setHeaderData(3, Qt::Horizontal, "Size");
    model->setHeaderData(4, Qt::Horizontal, "Floor");
    model->setHeaderData(5, Qt::Horizontal, "Order1");

Записываю все это так

Код:
void dbCreate::downloadData(QString &file, QString &floor, QString &order)
{
    QSqlQuery query(db);
    QFileInfo name = file;

    QFile inFile(file);

    if(!inFile.open(QIODevice::ReadOnly))    
        qDebug() << "error open file";    

    QByteArray photo = inFile.readAll();
    quint64 size = inFile.size();
    QString sizeMKB;
    QString MKB[3] = {"MB", "KB", "B"};

    if(size > 1024*1024 - 1)
        sizeMKB = QString::number(qreal(size) / (1024*1024), 'f', 1) + " " + MKB[0];
    else if(size > 1023)
        sizeMKB = QString::number(qreal(size) / 1024, 'f', 1) + " " + MKB[1];
    else if(size < 1024)
        sizeMKB = QString::number(qreal(size)) + " " + MKB[2];


    if(query.prepare("INSERT INTO photos (Photo, File_Name, Size, Floor, Order1) VALUES (:Photo, :File_Name, :Size, :Floor, :Order1)"))
    {
        query.bindValue(":Photo", photo);
        query.bindValue(":File_Name", name.fileName());
        query.bindValue(":Size", sizeMKB);
        query.bindValue(":Floor", floor);
        query.bindValue(":Order1", order);        

        if(query.exec())                    
            model->select();        
        else
             QMessageBox::critical(0, QString::number(query.lastError().type()), query.lastError().text());
    }
    else
        qDebug() << query.lastError().text();
}

Необходимо считывать подряд по щелчку по кнопке и отображать фотографию(отображение пока не трогаем...).

Пытаюсь считать изображение(передавая его номер):

Код:
void dbCreate::writeData(int Scene_Id)
{
    QSqlQuery query(db);
    query.prepare("SELECT Photo FROM photos WHERE Id = :Id");
    query.bindValue(":Id", Scene_Id);
    query.exec();
    if(query.first())
    {
        QByteArray photo = query.value(1).toByteArray();
        QFile filePhoto("123.jpg"); // имя все время одно и тоже пока, но это не важно....

        if(filePhoto.open(QIODevice::WriteOnly))
            filePhoto.write(photo);
        else
            qDebug() << "error";
    }
    else
        qDebug() << query.lastError().type() << query.lastError().text();    
}


файл появляется, но его размер всегда 0.
В чем может быть проблема?
« Последнее редактирование: Июнь 12, 2011, 15:53 от dsp » Записан
_OLEGator_
Гость
« Ответ #1 : Июнь 12, 2011, 20:04 »

Может query.value(0).toByteArray() ?
Записан
dsp
Гость
« Ответ #2 : Июнь 12, 2011, 20:34 »

Может query.value(0).toByteArray() ?

Результат запроса находится в первой колонке  - Value(1), а не в нулевой ( Value(0) ).
Записан
_OLEGator_
Гость
« Ответ #3 : Июнь 12, 2011, 20:36 »

Тогда не вяжется
query.prepare("SELECT Photo FROM photos WHERE Id = :Id");
с
query.value(1).toByteArray();

нумерация колонок идет с 0
Записан
dsp
Гость
« Ответ #4 : Июнь 12, 2011, 22:34 »

Тогда не вяжется
query.prepare("SELECT Photo FROM photos WHERE Id = :Id");
с
query.value(1).toByteArray();

нумерация колонок идет с 0

Значит я хреново понимаю чего делает Value...

Value возвращает результат запроса - в данном случае результатом должна быть ячейка в колонке под названием Photo с Id = какое-то число! или я наврал?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июнь 12, 2011, 23:06 »

Value возвращает результат запроса - в данном случае результатом должна быть ячейка в колонке под названием Photo с Id = какое-то число! или я наврал?
Да именно одна колонка и она будет иметь индекс ноль. С номером столбца в исходной таблице этот индекс не имеет ничего общего.
Записан
dsp
Гость
« Ответ #6 : Июнь 12, 2011, 23:17 »

Value возвращает результат запроса - в данном случае результатом должна быть ячейка в колонке под названием Photo с Id = какое-то число! или я наврал?
Да именно одна колонка и она будет иметь индекс ноль. С номером столбца в исходной таблице этот индекс не имеет ничего общего.

на value(0) ошибка

Код:
QSqlQuery::value: not positioned on a valid record
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Июнь 13, 2011, 08:42 »

Проверь результат запроса, возвращает ли он что нибудь, и вместо query.first() сделай query.next()
Записан
dsp
Гость
« Ответ #8 : Июнь 13, 2011, 10:47 »

Ураааааа!
Сделал так

Цитировать
QByteArray dbCreate::writeData(int Scene_Id)
{
    QSqlQuery query(db);
    query.prepare("SELECT Photo FROM photos WHERE Id = :Id");
    query.bindValue(":Id", Scene_Id);

    if(query.exec())
    {
        while(query.next())
        {
            QByteArray photo = query.value(0).toByteArray();
            QFile filePhoto(QString::number(Scene_Id) + ".jpg");

            if(filePhoto.open(QIODevice::WriteOnly))
            {
                filePhoto.write(photo);
                return filePhoto;
            }
            else
                qDebug() << "error";
        }
    }
    else
        qDebug() << query.lastError().type() << query.lastError().text();

и заработало - файлы стали появляться и отображаться...
только как-то не очень хорошо так делать - return где-то внутри, а логика программы дальше идет...
« Последнее редактирование: Июнь 13, 2011, 11:01 от dsp » Записан
Alucard
Гость
« Ответ #9 : Июнь 13, 2011, 10:54 »

exceptions
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Июнь 13, 2011, 10:55 »

только как-то не очень хорошо так делать - return где-то внутри, а логика программы дальше идет...
return внутри это нормально, если в данной ветке больше ничего делать не надо.
Но по хорошему надо возвращать хоть какой-то результат даже если ничего не прочиталось, функция-то должна результат возвращать.
Скажем, пустой массив: return QByteArray();
Записан
dsp
Гость
« Ответ #11 : Июнь 13, 2011, 11:04 »

Спасибо всем, друзья. Проблема решена - все работает!

Функуция немного изменилась. Возвращает теперь QString,т.к. мне в OpenGL надо передавать имя файла, который будет отображаться.

Код:
QString dbCreate::writeData(int Scene_Id)
{
    QSqlQuery query(db);
    query.prepare("SELECT Photo FROM photos WHERE Id = :Id");
    query.bindValue(":Id", Scene_Id);

    if(query.exec())
    {
        while(query.next())
        {
            QByteArray photo = query.value(0).toByteArray();
            QFile filePhoto(QString::number(Scene_Id) + ".jpg");

            if(filePhoto.open(QIODevice::WriteOnly))
            {
                filePhoto.write(photo);
                return filePhoto.fileName();
            }
            else
                qDebug() << "error";
        }
    }
    else
        qDebug() << query.lastError().type() << query.lastError().text();
    return QString();
}

Записан
dsp
Гость
« Ответ #12 : Июнь 13, 2011, 11:09 »

Кстати, совсем забыл, была еще одна небольшая проблема.
Если в бд начинаешь в первый раз что-то добавлять, то не отображаются ни ее названия столбцов ни содержимое. Если программу перезапустить, то все появляется и дальше все отображаеся, когда делаешь INSERTы. Вроде бы select() поставил, а толку нет...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 23.