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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SQLITE+QT4.5 не получается выполнить Drop Table QSqlQuery  (Прочитано 14406 раз)
NOs
Гость
« : Апрель 02, 2009, 15:47 »

В общем пытаюсь сделать Удаление столбца...вот когда в таблице нет записей все прекрасно работает но когда они есть пишет типа Database table is locked))что это помогите )))
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 02, 2009, 20:45 »

1. Drop Table  - удаление таблицы, а не столбца.
2. Ты скорее всего сначала где-то делаешь SELECT на таблицу, а потом пытаешься ее удалить. Приведи код.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
NOs
Гость
« Ответ #2 : Апрель 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");


}


Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 03, 2009, 16:43 »

QSqlTableModel и блокирует удаление. Чтобы таблица удалилась, нельзя, чтобы на ней был селект.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
NOs
Гость
« Ответ #4 : Апрель 06, 2009, 09:54 »

Ммм а как нить можно  этот селект завершить или что нить типо того потому что  как без  этого селекта показать данные???
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Апрель 06, 2009, 10:09 »

2 NOs, ты как-то сложно затеял работу с БД.
Если тебе надо что-то показывать пользователю, зачем одновременно с этим удалять данные?
Записан

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Апрель 06, 2009, 17:10 »

Ммм а как нить можно  этот селект завершить или что нить типо того потому что  как без  этого селекта показать данные???
Можно, model->select(QSqlQuery());
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
NOs
Гость
« Ответ #7 : Апрель 06, 2009, 17:16 »

Ну просто необходимо что бы пользователь имел возможность добавлять и удалять столбцы)))я сам в шоке от этой проблемы маленькой казалось бы такая задачка простая но она мне уже мозг вынесла))))Вообще я  QT постигаю тока неделю)))
Записан
NOs
Гость
« Ответ #8 : Апрель 08, 2009, 13:26 »

Ммм а как нить можно  этот селект завершить или что нить типо того потому что  как без  этого селекта показать данные???
Можно, model->select(QSqlQuery());

model->select(QSqlQuery()); не работает так говорит нет прототипа что б вызвать с таким параметром(((
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Апрель 08, 2009, 17:22 »

Тьфу, блин, перепутал немного.
Попробуй setTable ("") или setQuery(QSqlQuery())
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Апрель 08, 2009, 19:43 »

2 NOs, не вдаваясь в подробности того, что ты делаешь у меня мысль такая:
1) перед самым добавлением/удалением столбца, запрещаем обновление виджета, на котором представление расположено (setUpdatesEnable(false)), чтобы картинка на нем замерзла;
2) затем установить в модели "левую" таблицу, чтобы она отцепилась от нужной
3) Пересоздать таблицу
4) Прицепить новорожденную к модели
5) скомандовать модели select()
6) Разморозить виджет (setUpdatesEnable(true))

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

Юра.
NOs
Гость
« Ответ #11 : Апрель 13, 2009, 10:41 »

 Смеющийся ураааааааааа получилось тупо правда но главное что работает)))))))короче сначала копирую таблицу )потом удаляю из неё все )делаю селект на модели из этой же пустой таблицы )удаляю её)))переименовываю копию)))это пипец)))спасибо всем за помощь))))
Записан
NOs
Гость
« Ответ #12 : Май 18, 2009, 15:29 »

Так вот опять проблема когда записей в таблице много все равно SQLITE лажает в чем проблема и как её обойти не знаю но таблица блокируется и столбец опять не удаляется)))самое интересное что теперь после закрытия софтины добавленные столбцы не сохраняются
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #13 : Май 20, 2009, 02:48 »

Пожайлуста если вам не трудно обрисуйте вашу задачу! Я когда то много работал с БД - вы уверены что действительно пользователю необходимо удалять и создавать столбцы? (Мне кажется это оправдано только если вы пишите средство разработки и администрирования БД - он по идее в остальных случаях не должен менять метаданные.. хотя конечно случаи бывают разные....) Нельзя ли там обойтись связью "один ко многим"? Типа есть сущность экземпляры которой описываютя в одной таблице и есть свойства этой сущности лежащие в другой таблице, которых может быть много и которые пользователь могет создавать?
Записан
NOs
Гость
« Ответ #14 : Май 20, 2009, 12:38 »

Да в общем решил я FireBird юзать с ней свои замороки но решилась проблема со столбцом))))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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