crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Запрос вставки, с помощью QSqlQuery
AD
  опции профиля:
сообщение 30.3.2011, 11:01
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Неужели ни у кого не было подобной проблемы при работе с SQLite?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 30.3.2011, 13:07
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(AD @ 29.3.2011, 16:17) *
Буду рад, если поможете. Не понимаю, как сделать правильный commit транзакции. Возвращает ошибку, указанную в предыдущем посте. Повторюсь, что это необходимо, чтобы БД приняла данные, т.е. чтобы данные сохранились в БД. На данный момент получается такая фигня, что я вижу добавленные данные во время работы приложения. Но как только я перезапускаю приложение, данных нет. Сделать так, чтобы commit в итоге стал true не получается....

bool QSqlDatabase::commit ()
Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true в случае успеха операции. В противном случае возвращает false.
Замечание: Для некоторых баз данных фиксация транзакции завершится неудачно и возвратит false, если использовалась active query базы данных для SELECT. Сделайте запрос inactive перед выполнением фиксации транзакции.

http://www.javatalks.ru/ntopic9646.php
конечно там на java ну смысл я думаю тот же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.3.2011, 13:26
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MJIbIu @ 30.3.2011, 14:07) *
bool QSqlDatabase::commit ()
Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true в случае успеха операции. В противном случае возвращает false.
Замечание: Для некоторых баз данных фиксация транзакции завершится неудачно и возвратит false, если использовалась active query базы данных для SELECT. Сделайте запрос inactive перед выполнением фиксации транзакции.

http://www.javatalks.ru/ntopic9646.php
конечно там на java ну смысл я думаю тот же

Я умею читать ассистент. setAutocommit - в Qt нет. Сделал для запроса clear(), не прокатило. Что еще возможно? Данную ссылку уже сам находил - не помогло. Запрос делаю неактивным, но в БД запись не попадает.

Сообщение отредактировал AD - 31.3.2011, 11:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 31.3.2011, 11:38
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вернулся к СУБД Paradox. Решение на данную проблему найти не смог. Буду пробовать ускорять работу запросов в Paradox
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.4.2011, 9:22
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В связи с тем, что скорость работы на Paradox маленькая, перешел обратно на SQLite. Проблема осталась. Не удается внести и запомнить записи. При транзакции коммит не удается сделать.
Выдает следующее сообщение
Цитата
cannot commit transaction - SQL statements in progress Unable to commit transaction

Самое странное, что записи из файла он в таблицу вставил нормально. Кто может помочь с этой проблемой. Уже несколько дней мучаюсь, решить не получается. Буду благодарен за помощь.

Вот функция, в которой транзакция не выполняется.
Раскрывающийся текст

/// Вcmaвka строк в таблицу AztPage
bool SqlFileModel::insertRowsAztPage(int row, int count)
{
    if(tableName() != QString("AztPage")) return false;

    QSqlDatabase db(QSqlDatabase::database("conn_1"));
    bool trans = db.transaction();

    QSqlQuery check_query(db);
    check_query.prepare("select max(Id) from AztPage");
    bool is_sel = check_query.exec(), is_next = check_query.next();
    QStringList chart_names(valueElement("Azt/ChartFiles", QStringList()).toStringList());
    QString chart_name(chart_names.at(row));
    int sz = rowCount(), id = sz, stump_group_of_pages_id = 1;    ///< TODO: номер группы страниц (затычка)
    ++id;
    if(is_sel && is_next)
        id = check_query.value(0).toInt(),
        ++id;
    for(int i=0; i<sz; ++i)
    {
        QString file_name(record(i).value("SpatialFilePath").toString());
        if(chart_names.at(row).toLower() == file_name.toLower())
            return false;
    }
    string fname(chart_name.replace(QString(QString(".") + QFileInfo(chart_name).suffix()),
                        QString(""), Qt::CaseInsensitive).toStdString());
    char* string_name_chart(const_cast<char*> (fname.c_str()));
    QString query_string(QString("insert into AztPage(Id, SpatialFilePath, GroupOfPagesId) "
                        "values(%1, '%2', %3)").arg(id).
                        arg(chart_names.at(row)).arg(stump_group_of_pages_id));
    QSqlQuery query(QSqlDatabase::database("conn_1"));
    query.prepare(query_string);
    bool res = query.exec();

    bool comm = db.commit();
    if(!comm)
    {
        QString error_string(db.lastError().text());
        int error_number = db.lastError().type();
    }

    return res;
}



Сообщение отредактировал AD - 11.4.2011, 9:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 11.4.2011, 21:41
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(QtAssistant)
bool QSqlQuery::isActive () const
...
Note: Of particular interest is an active query that is a SELECT statement. For some databases that support transactions, an active query that is a SELECT statement can cause a commit() or a rollback() to fail, so before committing or rolling back, you should make your active SELECT statement query inactive using one of the ways listed above.

Попробуй перед фиксацией транзакции для всех активных запросах вызвать clear()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 12.4.2011, 9:32
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MoPDoBoPoT @ 11.4.2011, 22:41) *
Попробуй перед фиксацией транзакции для всех активных запросах вызвать clear()

Пробовал. Не помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 12.4.2011, 14:18
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В результате долгих копаний. Кое-что смог выяснить. Исходя из этой статьи, выяснил, что БД SQLite может хранится в памяти, а может в файле. Вопрос. Как организовать правильное хранение в памяти? Т.е. что конкретно надо поменять в данном коде:
/// Функция для создания соединения с базой данных
bool createConnection(const QString& odbc_path)
{
    QSqlDatabase db(QSqlDatabase::database("conn_1"));
    if(db.isOpen()) db.close();

    db = QSqlDatabase::addDatabase("QSQLITE", "conn_1");
    db.setDatabaseName(odbc_path);

    if(!db.open())
    {
        QSqlError error(db.lastError());
        QMessageBox msg(QMessageBox::Critical, "Connections", error.text(), QMessageBox::Ok, 0);
        msg.exec();
        return false;
    }
    return true;
}

Куда это ":in_memory:" добавить? Ну и попутный вопрос к ViGOur: помнится где-то была статья и сборке плагина без сборки всего Qt. Дайте, пожалуйста, ссылку на эту статью. Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 12.4.2011, 21:19
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(AD @ 12.4.2011, 10:32) *
Пробовал. Не помогает.

Возможно, что где-то ещё активные запросы, например, табличные модели.
Цитата(AD @ 12.4.2011, 15:18) *
Как организовать правильное хранение в памяти?

    db = QSqlDatabase::addDatabase("QSQLITE", "conn_1");
    db.setDatabaseName(":memory:");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 13.4.2011, 9:32
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MoPDoBoPoT @ 12.4.2011, 22:19) *
Возможно, что где-то ещё активные запросы, например, табличные модели.

А как в табличных моделях сделать неактивными запросы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 11.12.2024, 13:31