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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: SQL  (Прочитано 9775 раз)
codeLocker
Гость
SQL
« : Сентябрь 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");


Это глюк или так и надо?
Если это правильноая реакция, то можно ли как-то отключить такое поведение?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
SQL
« Ответ #1 : Сентябрь 02, 2005, 15:02 »

а у тебя база какая

с транзакциями или нет?
Записан
codeLocker
Гость
SQL
« Ответ #2 : Сентябрь 02, 2005, 15:22 »

Цитата: "Admin"
а у тебя база какая

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

Да, транзакции поддерживает.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
SQL
« Ответ #3 : Сентябрь 02, 2005, 17:50 »

не забываешь commit делать?
Записан
codeLocker
Гость
SQL
« Ответ #4 : Сентябрь 03, 2005, 09:02 »

Делаю так:
Код:

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

где QSqlDatabase db;
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
SQL
« Ответ #5 : Сентябрь 03, 2005, 10:57 »

очевидно у тебя тогда драйвер или база глючат

а что за база?
Записан
codeLocker
Гость
SQL
« Ответ #6 : Сентябрь 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);");
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
SQL
« Ответ #7 : Сентябрь 03, 2005, 21:08 »

да нет все верно вроде
Записан
codeLocker
Гость
SQL
« Ответ #8 : Сентябрь 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");

то запись удаляется, видимо там стоит какая-то блокировка если она сейчас является текущей.
Вот как бы ее отключить?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
SQL
« Ответ #9 : Сентябрь 04, 2005, 13:17 »

багня похоже какая то
Записан
varita91
Гость
« Ответ #10 : Апрель 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();
« Последнее редактирование: Апрель 02, 2018, 11:23 от varita91 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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