Russian Qt Forum

Qt => Базы данных => Тема начата: NOs от Апрель 02, 2009, 15:47



Название: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Апрель 02, 2009, 15:47
В общем пытаюсь сделать Удаление столбца...вот когда в таблице нет записей все прекрасно работает но когда они есть пишет типа Database table is locked))что это помогите )))


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: Пантер от Апрель 02, 2009, 20:45
1. Drop Table  - удаление таблицы, а не столбца.
2. Ты скорее всего сначала где-то делаешь SELECT на таблицу, а потом пытаешься ее удалить. Приведи код.


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Апрель 03, 2009, 12:32
МММ я еще использую для отобораженя QSqlTableModel возможно он блокирует.Я знаю что Drop Table это удаление таблицы но поскольку SQLITE не поддерживает ALTER table DROP column то приходиться извращаться вот таким вот образом

Код:

QSqlQuery queryEx(QString q)
{
Dialog dd;

QSqlQuery sqlQuery,res;

       if (!sqlQuery.exec(q)){

         
           dd.errorMessage("DB Error:"+ sqlQuery.lastError().text());

                   
                        return FALSE;
        }
        else{
             sqlQuery.exec(q);

               
            res=sqlQuery;
            sqlQuery.clear();
     


        }

return res;
}

void drop_coll(QString name)
{

QSqlQuery tt=queryEx("SELECT * FROM addressbook");

QSqlRecord   rec=tt.record();
 QString fields,rr=" ";
 queryEx("DROP TABLE IF EXISTS 'CustCopy'");
 queryEx("CREATE TABLE IF NOT EXISTS 'CustCopy' ("
                "`id` INTEGER PRIMARY KEY NOT NULL,"
                "`groop` INTEGER,"
                "`name` char(200),"
                "`phone` char(200)"

                    "); ");




           for(int j=0; j<rec.count(); j++)
              if( rec.fieldName(j)!=name)
              {
               if(j!=0) rr= ",";
               fields+=rr+" "+rec.fieldName(j)+" ";
               if(j>3)  queryEx("ALTER TABLE 'CustCopy' ADD "+rec.fieldName(j) +" char(200)");
               }




queryEx("INSERT INTO CustCopy("+ fields + ") SELECT "+fields+" FROM addressbook");
queryEx("DELETE FROM addressbook");
queryEx("DROP TABLE addressbook");
queryEx("ALTER TABLE CustCopy RENAME TO addressbook");


}




Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: Пантер от Апрель 03, 2009, 16:43
QSqlTableModel и блокирует удаление. Чтобы таблица удалилась, нельзя, чтобы на ней был селект.


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Апрель 06, 2009, 09:54
Ммм а как нить можно  этот селект завершить или что нить типо того потому что  как без  этого селекта показать данные???


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: lit-uriy от Апрель 06, 2009, 10:09
2 NOs, ты как-то сложно затеял работу с БД.
Если тебе надо что-то показывать пользователю, зачем одновременно с этим удалять данные?


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: Пантер от Апрель 06, 2009, 17:10
Ммм а как нить можно  этот селект завершить или что нить типо того потому что  как без  этого селекта показать данные???
Можно, model->select(QSqlQuery());


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Апрель 06, 2009, 17:16
Ну просто необходимо что бы пользователь имел возможность добавлять и удалять столбцы)))я сам в шоке от этой проблемы маленькой казалось бы такая задачка простая но она мне уже мозг вынесла))))Вообще я  QT постигаю тока неделю)))


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Апрель 08, 2009, 13:26
Ммм а как нить можно  этот селект завершить или что нить типо того потому что  как без  этого селекта показать данные???
Можно, model->select(QSqlQuery());

model->select(QSqlQuery()); не работает так говорит нет прототипа что б вызвать с таким параметром(((


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: Пантер от Апрель 08, 2009, 17:22
Тьфу, блин, перепутал немного.
Попробуй setTable ("") или setQuery(QSqlQuery())


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: lit-uriy от Апрель 08, 2009, 19:43
2 NOs, не вдаваясь в подробности того, что ты делаешь у меня мысль такая:
1) перед самым добавлением/удалением столбца, запрещаем обновление виджета, на котором представление расположено (setUpdatesEnable(false)), чтобы картинка на нем замерзла;
2) затем установить в модели "левую" таблицу, чтобы она отцепилась от нужной
3) Пересоздать таблицу
4) Прицепить новорожденную к модели
5) скомандовать модели select()
6) Разморозить виджет (setUpdatesEnable(true))

Вот, например, так.


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Апрель 13, 2009, 10:41
 ;D ураааааааааа получилось тупо правда но главное что работает)))))))короче сначала копирую таблицу )потом удаляю из неё все )делаю селект на модели из этой же пустой таблицы )удаляю её)))переименовываю копию)))это пипец)))спасибо всем за помощь))))


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Май 18, 2009, 15:29
Так вот опять проблема когда записей в таблице много все равно SQLITE лажает в чем проблема и как её обойти не знаю но таблица блокируется и столбец опять не удаляется)))самое интересное что теперь после закрытия софтины добавленные столбцы не сохраняются


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: break от Май 20, 2009, 02:48
Пожайлуста если вам не трудно обрисуйте вашу задачу! Я когда то много работал с БД - вы уверены что действительно пользователю необходимо удалять и создавать столбцы? (Мне кажется это оправдано только если вы пишите средство разработки и администрирования БД - он по идее в остальных случаях не должен менять метаданные.. хотя конечно случаи бывают разные....) Нельзя ли там обойтись связью "один ко многим"? Типа есть сущность экземпляры которой описываютя в одной таблице и есть свойства этой сущности лежащие в другой таблице, которых может быть много и которые пользователь могет создавать?


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: NOs от Май 20, 2009, 12:38
Да в общем решил я FireBird юзать с ней свои замороки но решилась проблема со столбцом))))


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: ритт от Май 20, 2009, 17:41
а лучше бы послушал break'а...


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: grio от Март 01, 2010, 02:58
Долго искал причину этой проблемы.
Нашел. Если функция, содержащаяя запрос DROP TABLE, запускается из
конструкции вроде if (query.next()) то возникает подобная ошибка.

Завтра буду решать QSqlQuery::value: not positioned on a valid record
:)


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: break от Март 01, 2010, 10:30
Цитировать
Долго искал причину этой проблемы.
Нашел. Если функция, содержащаяя запрос DROP TABLE, запускается из
конструкции вроде if (query.next()) то возникает подобная ошибка.
если идти по таблице и тут же пытаться удалить ее - то вероятно сервер не даст т.к. таблица учавствует в незакрытой транзакции (sql курсор там активен)

Цитировать
Завтра буду решать QSqlQuery::value: not positioned on a valid recorde
а что тут решать?

query.first(); - или другой метод устанавливающий курсор на данные


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: grio от Март 01, 2010, 14:51
Цитировать
если идти по таблице и тут же пытаться удалить ее - то вероятно сервер не даст т.к. таблица учавствует в незакрытой транзакции (sql курсор там активен)
Нет. Дело как раз в том, что выборка может быть из любой другой таблицы.
Это все равно вызовет ошибку.

Цитировать
а что тут решать?
query.first(); - или другой метод устанавливающий курсор на данные
Это все ты правильно говоришь. Однако я в этом случае ищу причину, а не борюсь со следствием.


Название: Re: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery
Отправлено: break от Март 02, 2010, 00:53
Цитировать
Нет. Дело как раз в том, что выборка может быть из любой другой таблицы.
Это все равно вызовет ошибку.
у меня есть модуль который обновляет БД - он работает с FB

создает таблицы, создает/удаляет столбцы, удаляет таблицы, индексы и т.д. и ВСЕ работает!

Цитировать
Это все ты правильно говоришь. Однако я в этом случае ищу причину, а не борюсь со следствием.
сообщение
Цитировать
Завтра буду решать QSqlQuery::value: not positioned on a valid recorde
не имело никакого контекста - единственная ПРИЧИНА по которой оно выводится - попытка получать данные когда курсор запроса ( Query ) еще ни на что не установлен (сделали select но не сделали first() ). Это именно причина а не следствие - если есть другая причина для этого - приведи пример!