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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: БД для новичка. Помогите, нужно быстро разобратся  (Прочитано 19299 раз)
daimon
Гость
« : Декабрь 05, 2009, 16:47 »

Как удалить файл базы данных?
Код:
#include <QtGui>
#include <QtSql>
#include <QMessageBox>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("addressbook");

    db.setUserName("elton");
    db.setHostName("epica");
    db.setPassword("password");
    
//
    if( db.open())
{
if(db.tables().isEmpty())
{ QMessageBox::critical(0,QObject::tr("Database Error"), QString(db.lastError().text()));
}
if(db.tables().isEmpty())
{db.close();db.removeDatabase("addressbook");}

        return false;
    }

    return true;
}

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }

  /*  QTableView     view;
    QSqlTableModel model;

    model.setTable("addressbook");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
    
    view.setModel(&model);
    view.show();*/
    
    return app.exec();
}
файл не удаляется. Что делать?
« Последнее редактирование: Декабрь 05, 2009, 19:28 от daimon » Записан
Alp
Гость
« Ответ #1 : Декабрь 05, 2009, 17:16 »

Не увидел в коде ни одной строчки удаляющей ФАЙЛ, так что не удивительно, что он остается на диске.
Почувствуй разницу: удаление базы данных и удаление файла базы данных =)
Записан
daimon
Гость
« Ответ #2 : Декабрь 05, 2009, 17:26 »

Не увидел в коде ни одной строчки удаляющей ФАЙЛ, так что не удивительно, что он остается на диске.
Почувствуй разницу: удаление базы данных и удаление файла базы данных =)
Какая функция удаления файла? (наверное надо использовать QFile)
« Последнее редактирование: Декабрь 05, 2009, 17:55 от daimon » Записан
daimon
Гость
« Ответ #3 : Декабрь 05, 2009, 18:03 »

Код:
#include <QtGui>
#include <QtSql>
#include <QMessageBox>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("addressbook");

    db.setUserName("elton");
    db.setHostName("epica");
    db.setPassword("password");
   

if( db.isOpenError())
{
QMessageBox::critical(0,QObject::tr("Database Error"), QString(db.lastError().text()));

        return false;
    }

    return true;
}

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }

    QTableView     view;
    QSqlTableModel model;

    model.setTable("addressbook");
    model.select();
// model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
model.insertRow(0);
model.setData(model.index(0,0),223213123);
model.submitAll();
    view.setModel(&model);
    view.show();
   
    return app.exec();
}
работает неправильно. Как исправить?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Декабрь 05, 2009, 18:13 »

>>работает неправильно.
что значит это утверждение? Копает совковой лопатой, а не штыковой?
Записан

Юра.
daimon
Гость
« Ответ #5 : Декабрь 05, 2009, 18:14 »

>>работает неправильно.
что значит это утверждение? Копает совковой лопатой, а не штыковой?
Данные не записываются в базу (в файл) и в представлении фокусы начинаются.
Файл БД открывается пустой.
« Последнее редактирование: Декабрь 05, 2009, 18:50 от daimon » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Декабрь 05, 2009, 18:51 »

Цитировать
Не увидел в коде ни одной строчки удаляющей ФАЙЛ, так что не удивительно, что он остается на диске.
Почувствуй разницу: удаление базы данных и удаление файла базы данных =)

Сначала убедитесь что сервер разрешает работать с файлами БД напрямую, например IB/FB это не расрешает - можно удалить файл БД после выключения сервера. Или используйте соответствующую утилиту из набора вашей БД для IB - isql которая умеет создавать/удалять Базы...
Записан
daimon
Гость
« Ответ #7 : Декабрь 05, 2009, 19:01 »

Как с помоью модели заполнить базу данных (файл)
Код:
#include <QtGui>
#include <QtSql>
#include <QMessageBox>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("addressbook");

    db.setUserName("elton");
    db.setHostName("epica");
    db.setPassword("password");
    

if( db.isOpenError())
{
QMessageBox::critical(0,QObject::tr("Database Error"), QString(db.lastError().text()));

        return false;
    }

    return true;
}

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }

    QTableView     view;
    QSqlTableModel model;

    model.setTable("addressbook");
   model.select();
// model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
model.insertRow(3);
model.setData(model.index(0,0),223213123);
model.submitAll();
    view.setModel(&model);
    view.show();
    
    return app.exec();
}


Такой код не работает. Обязательно использовать QSqlQuery?
« Последнее редактирование: Декабрь 05, 2009, 19:05 от daimon » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 05, 2009, 19:08 »

daimon, ты для начал БД открой (QSqlDatabase::open())

О работе с базой данных (через модель) смотри примеры, например:
%QTDIR%\examples\sql\cachedtable

по поводу заполнения БД пользователем смотри демку sqlbrowser, в ней щёлкая по таблице правой кнопкой мыши можно добавлять/удалять записи. Демка непростая, ео при желании можно разобраться
« Последнее редактирование: Декабрь 05, 2009, 19:17 от lit-uriy » Записан

Юра.
daimon
Гость
« Ответ #9 : Декабрь 05, 2009, 19:18 »

daimon, ты для начал БД открой (QSqlDatabase::open())

О работе с базой данных (через модель) смотри примеры, например:
%QTDIR%\examples\sql\cachedtable
По примеру видно, что модель нужна только для отображения, а с базой работает QSqlQuery (insertRow не вставляет новую строку именно в Бд файл)
Код:
 QSqlQuery query;
    query.exec("create table person (id int primary key, "
               "firstname varchar(20), lastname varchar(20))");
    query.exec("insert into person values(101, 'Danny', 'Young')");
    query.exec("insert into person values(102, 'Christine', 'Holand')");
    query.exec("insert into person values(103, 'Lars', 'Gordon')");
    query.exec("insert into person values(104, 'Roberto', 'Robitaille')");
    query.exec("insert into person values(105, 'Maria', 'Papadopoulos')");
Можно создать БД, только с помощью модели (insertRow, setHeaderData...)? Зачем тогда в QSqlTableModel есть insertColumn, insertRow? Будьте добры помогите
« Последнее редактирование: Декабрь 05, 2009, 19:58 от daimon » Записан
gmorgunov
Гость
« Ответ #10 : Декабрь 05, 2009, 22:27 »

daimon
Для OnManualSubmit ---> submitAll().
Для OnRowChange   ---->  submit() 
        OnFieldChange   ----> submit()
Слоты надо вызывать явно.Слоты срабатывают при переходе на другую строку, и сразу происходит сортировка.
Доработанный пример из книги Шлее:
Код:
#include <QtGui>
#include <QtSql>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("addressbook");

    db.setUserName("elton");
    db.setHostName("epica");
    db.setPassword("password");
    if (!db.open()) {
        qDebug() << "Cannot open database:" << db.lastError();
        return false;
    }
    return true;
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }

    QTableView     view;
    QSqlTableModel model;

    model.setTable("addressbook");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange); 
//!!!!!!!!!!!!!!!
    model.submit();
//!!!!!!!!!!!!!!
    view.setModel(&model);
    view.show();
   
    return app.exec();
В ассистанте это прописано, а вот в примере Шлее была ошибка, он не вызывал слот submit(). Сам сидел полчаса, пока не разобрался. Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Декабрь 05, 2009, 22:53 »

>insertRow не вставляет новую строку именно в Бд файл
Логика работы более или менее нормальной БД: Осуществляются манипуляции с таблицами, затем делается:
либо подтверждение (фиксация) изменений - commit
либо откат - rollback

>модель нужна только для отображения
не верно
Модель - интерфейс к хранилищу данных (может содержать их и в себе, например, QStandardItemModel)
Представление - представление (отображение) данных из модели.

конкретно по примеру cachedtable, троли, для упрощения, сделали один файлик для нескольких примеров, который намолачивает данные в БД, а затем полученная БД используется для демонстрации работы с модулем QSql
« Последнее редактирование: Декабрь 05, 2009, 22:55 от lit-uriy » Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Декабрь 05, 2009, 22:58 »

>>а вот в примере Шлее была ошибка, он не вызывал слот submit()
Чушь

>>model.submit();
что ты зафиксировал в БД этой строчкой?
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Декабрь 05, 2009, 23:05 »

>>Зачем тогда в QSqlTableModel есть insertColumn, insertRow?
Чтобы вставить в модель строку/колонку, эти методы УНАСЛЕДОВАНЫ от QAbstractItemModel а она универсальна.

Скорее всего операция insertColumn/removeColumn не увенчается успехом при работе с БД.

Для insertRow: позволяет вставить строку в модель, но эти изменения висят в модели, затем нужно
либо их фиксировать (QSqlTableModel::submit (), QSqlTableModel::submitAll ())
либо откатывать (QSqlTableModel::revert (), QSqlTableModel::revertAll ())
Записан

Юра.
daimon
Гость
« Ответ #14 : Декабрь 05, 2009, 23:52 »

Как удалять данные из БД?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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