Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с базой данных с помощью Qt 
:(
    Опции темы
idsp
Дата 27.5.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



Привет!
Разбираюсь с бд, но пока не совсем успешно. Пишу программу.

Что она делает:

Выбирается папка с изображениями, проверяется валидность их имени по шаблону №этажа_№порядка("1floor_1order", "4floor_22order"...) кнопкой check.

Далее, кнопка start вмесете с изображениями передает информацию, взятую из имени файла (номер этажа и порядок следования фотографий), создавая таблицу на основе этих данных. Если проверка имени файла выявила неправильные имена файлов, то start блокируется.

Мозги совсем не варят, заболел (

Не могу сообразить, как загрузить данные в бд и вывести их в таблице.

Note: отображать фотографии не нужно, достаточно в поле "file" вывести их имя.



Это сообщение отредактировал(а) idsp - 27.5.2011, 16:37

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Program.zip 3,96 Kb
PM MAIL   Вверх
borisbn
Дата 27.5.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



в ф-ции
bool dbCreate::downloadData(QString file, QString &floor, QString &order)
при создании QSqlQuery ему нужно в качестве параметра дать БД, с которой работать. Вот так
Код

QSqlQuery query( db );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
idsp
Дата 27.5.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет




Исправил, но ситуация не изменилась
Код

   QSqlDatabase db = QSqlDatabase::database();
   QSqlQuery query(db);


Может, я что-то концептуально не понимаю и не реализовал. 
PM MAIL   Вверх
borisbn
Дата 27.5.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



ооооо. да, не усмотрел...
в ф-ции 
void dbCreate::createConnection()
создаётся БД
Код

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

и благополучно убивается по выходу из ф-ции.
QSqlDatabase db нужно сделать членом класса dbCreate, а в ф-ции downloadData не создавать БД, а использовать эту...
в общем как-то так:
Код

// dbCreate.h
#include <QSqlDatabase>
class dbCreate : public QObject
{
...
    QSqlDatabase db; // <-------
}
// dbCreate.cpp
void dbCreate::createConnection()
{
    db = QSqlDatabase::addDatabase("QSQLITE"); // <-------

    db.setDatabaseName("photos");
    if (!db.open())
        QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text());
}

void dbCreate::createTable()
{
    QSqlQuery query( db ); // <-------
    query.exec("CREATE TABLE photos (Id INTEGER PRIMARY KEY AUTOINCREMENT,"
                                           "File BLOB NOT NULL, "
                                           "Floor INTEGER NOT NULL, "
                                           "Order INTEGER NOT NULL, ");
}

bool dbCreate::downloadData(QString file, QString &floor, QString &order)
{
    QSqlQuery query( db ); // <-------

    QFile inFile(file);
    QByteArray photo = inFile.readAll();

    query.prepare("INSERT INTO tbl (File, Floor, Order) VALUES (:File, :Floor, :Order);");
    query.bindValue(":File", photo);
    query.bindValue(":Floor", floor);
    query.bindValue(":Order", order);
    return true;

    if(query.exec())
    {}
    else
       query.lastError().text();
}




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
idsp
Дата 27.5.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет




Исправил. 
Создал в папке фотографии с именами 3floor_11order 3floor_12order 3floor_13order , выбрал их, проверил их имена check'ом. 
И все на этом =)) больше ни какого эффекта не наблюдаю. Кнопка start, которая загружает фотки в бд ничего визуально не изменила. 
PM MAIL   Вверх
borisbn
Дата 29.5.2011, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



мдааа. невнимательно я посмотрел... у тебя модель никак не привязана к базе. в конструкторе QSqlTableModel нужно указать, с какой базой ей работать. Т.о. есть два варианта:
1. dbCreate нужно создавать раньше модели, добавить в этот класс ф-цию получения базы. что-нибудь такое
Код

class dbCreate {
...
public:
    QSqlDatabase & get_db() { return db; }
};

а при создании модели передать в неё БД:
Код

model = new QSqlTableModel( this, db->get_db() ); 


2. (Этот вариант мне лично больше нравится) Т.к. за БД у тебя отвечает отдельный класс (dbCreate), то и модель стОит создавать в нём:
Код

class dbCreate {
...
    QSqlTableModel * model;
public:
    QSqlTableModel * get_model();
};
void dbCreate::createConnection() {
    db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("photos");
    if (!db.open())
        QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text());

    model = new QSqlTableModel( this, db ); // <-------

    model->setTable("photos");
    model->setHeaderData(0, Qt::Horizontal, "id");
    model->setHeaderData(1, Qt::Horizontal, "file");
    model->setHeaderData(2, Qt::Horizontal, "floor");
    model->setHeaderData(3, Qt::Horizontal, "order");

    model->select();
} 

а в dbViewer:
Код

...
  db = new dbCreate;
  view = new QTableView;
  view->setModel( db->get_model() ); 
 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
idsp
Дата 9.6.2011, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



Столкнулся с двуми проблемами:
1) Если первый раз запустить программу и загрузить в нее данные, то они не отображаются сразу же в окне ( Вроде бы model->select() поставил, а не работает). Перезапуск программы помогает. После него все отображается сразу же после добавления.
2) Не получается из бд считать данные, все время возвращается -1.

Код

#include <QMessageBox>
#include "dbCreate.h"

dbCreate::dbCreate()
{
    createConnection();
    createTable();
}

void dbCreate::createConnection()
{
    db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("photos");
    if (!db.open())
    {
        QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text());
    }

    model = new QSqlTableModel(this, db);

    model->setTable("photos");
    model->setHeaderData(0, Qt::Horizontal, "Id");
    model->setHeaderData(1, Qt::Horizontal, "Photo");
    model->setHeaderData(2, Qt::Horizontal, "FileName");
    model->setHeaderData(3, Qt::Horizontal, "Floor");
    model->setHeaderData(4, Qt::Horizontal, "Order1");

    model->select();
}

QSqlTableModel* dbCreate::getModel()
{
    return model;
}

void dbCreate::createTable()
{
    QSqlQuery query(db);

    if(query.exec("CREATE TABLE IF NOT EXISTS photos (Id INTEGER PRIMARY KEY AUTOINCREMENT,"
                                       "Photo BLOB,"
                                       "FileName TEXT,"
                                       "Floor INTEGER NOT NULL,"
                                       "Order1 INTEGER NOT NULL)"))    
        qDebug() << "table create";
    else
        QMessageBox::information(0, "ERROR1", QString(query.lastError().text()), QMessageBox::Ok);
}

void dbCreate::downloadData(QString &file, QString &floor, QString &order)
{
    QSqlQuery query(db);




    if(query.exec("SELECT * FROM photos"))
        qDebug() << query.size();          // result -1




    QFile inFile(file);

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

    QByteArray photo = inFile.readAll();

    if(query.prepare("INSERT INTO photos (Photo, FileName, Floor, Order1) VALUES (:Photo, :FileName, :Floor, :Order1)"))
    {
        query.bindValue(":Photo", photo);
        query.bindValue(":FileName", inFile.fileName());
        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
        QMessageBox::information(0, "ERROR", QString(query.lastError().text()), QMessageBox::Ok);
}

void dbCreate::writeData()
{

}


PM MAIL   Вверх
idsp
Дата 10.6.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



Вторую проблему решил (считывание из базы данных).
Код

 query.exec("SELECT  * FROM photos");
    while(query.next())
    {
        qDebug() << query.value(4).toString();
    }

Забыл next использовать.


А вот с первой ни как не разберусь.
"1) Если первый раз запустить программу и загрузить в нее данные, то они не отображаются сразу же в окне, да и названий столбцов тоже нет( Вроде бы model->select() поставил, а не работает). Перезапуск программы помогает. После него все отображается сразу же после добавления."

Это сообщение отредактировал(а) idsp - 10.6.2011, 16:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.