Russian Qt Forum

Qt => Базы данных => Тема начата: codeLocker от Сентябрь 02, 2005, 13:38



Название: SQL
Отправлено: codeLocker от Сентябрь 02, 2005, 13:38
При открытии конкретной записи из БД SQLite не возможно удалить ее-же использовав другой экземпляр QSqlQuery
Код:

QSqlQuery query;
query.exec("select * from users where id=5");

QSqlQuery query2;
query2.exec("delete from users where id=5");


Это глюк или так и надо?
Если это правильноая реакция, то можно ли как-то отключить такое поведение?


Название: SQL
Отправлено: Admin от Сентябрь 02, 2005, 15:02
а у тебя база какая

с транзакциями или нет?


Название: SQL
Отправлено: codeLocker от Сентябрь 02, 2005, 15:22
Цитата: "Admin"
а у тебя база какая

с транзакциями или нет?

Да, транзакции поддерживает.


Название: SQL
Отправлено: Admin от Сентябрь 02, 2005, 17:50
не забываешь commit делать?


Название: SQL
Отправлено: codeLocker от Сентябрь 03, 2005, 09:02
Делаю так:
Код:

        db.transaction();
        queryApply->prepare( "DELETE FROM users WHERE id=:id;");
        queryApply->bindValue(":id", id);
        queryApply->exec();
        db.commit();

где QSqlDatabase db;


Название: SQL
Отправлено: Admin от Сентябрь 03, 2005, 10:57
очевидно у тебя тогда драйвер или база глючат

а что за база?


Название: SQL
Отправлено: codeLocker от Сентябрь 03, 2005, 11:37
Цитата: "Admin"
очевидно у тебя тогда драйвер или база глючат

а что за база?

SQLite

Может в определении таблицы что-то не то?
Код:

            QSqlQuery query( db );
            query.exec("create table users (id INTEGER PRIMARY KEY UNIQUE, " //Users
                       "login VARCHAR(20), "
                       "pwl VARCHAR(20), "
                       "fullname VARCHAR(20),"
                       "adminlevel INTEGER, "
                       "dateReg TIMESTAMP);");
            query.exec( "CREATE UNIQUE INDEX key_login ON users (login);");
            query.exec( "CREATE INDEX key_fullname ON users (fullname);");
            query.exec( "CREATE INDEX key_dateReg ON users (dateReg);");


Название: SQL
Отправлено: Admin от Сентябрь 03, 2005, 21:08
да нет все верно вроде


Название: SQL
Отправлено: codeLocker от Сентябрь 04, 2005, 12:58
я земетил, если сделать так:
Код:

QSqlQuery query;
query.exec("select * from users where id>5");
query.next();
query.next();

QSqlQuery query2;
query2.exec("delete from users where id=5");

то запись удаляется, видимо там стоит какая-то блокировка если она сейчас является текущей.
Вот как бы ее отключить?


Название: SQL
Отправлено: Admin от Сентябрь 04, 2005, 13:17
багня похоже какая то


Название: Re: SQL
Отправлено: varita91 от Апрель 02, 2018, 10:44
По моим исследования работы Qt с SQLite
Во-первых, запрос возвращает ошибку если содержит ";" (т.к. не поддерживает множественность) - хотя и выполняется вроде как

Цитировать
queryApply->prepare( "DELETE FROM users WHERE id=:id;");

Во-вторых, нужно закрывать все запросы сразу после выполнения (сделали INSERT и выполнили, например, query.clear(); далее уже можем сделать DELETE по вставленной записи и снова закрыть запрос query2.clear();
В-третьих, при работе с транзакциями нужно учитывать уровень изоляции READ COMMITED по умолчанию, только зафиксированные изменения можно увидеть, а в рамках транзакции видим только данные на момент ее открытия, хоть и, например, добавили запись
В-четвертых, не исключено возникновение блокировок всей БД на запись - тоже обрабатывайте
В-пятых, наткнулась что вот такой код попробует выполнить вставку 3 раза

Код:
QSqlQuery query(strQ);
query.exec(strQ);
query.finish();

Поэтому стараюсь использовать вот такую конструкцию

Код:
QSqlQuery query;
query.exec(strQ);
strErr = query.lastError().text(); // если реально нет ошибок в запросе strQ или по результатам запроса, вернет пустую строку
query.clear();