crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Qt + SQLite, Не могу закрыть соединение с базой
Dimix
  опции профиля:
сообщение 24.11.2010, 14:44
Сообщение #1


Студент
*

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

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




Репутация:   0  


Я новичек в программировании средствами Qt да еще и с использованием SQLite. Прошу сильно не критиковать.

Проблема такова.
Существует главная БД, и N - количество дополнительных БД. В главной БД содержатся имена дополнительных БД. Делаю запрос по выбраному имени из главной БД и присваиваю имя переменной. Закрываю свою главную БД. И осуществляю соединение с БД имя которой содержится в переменной. Получаю.

QSqlQuery::exec: database not open

Я напливал на это оповещение и решил продолжить. Пытаюсь добавить в нее запись (ничего не происходит). Начинаю добавлять запись в Главную БД (соединение с которой разрывал) оно добавляет без проблем. (имена баз все разные) ОБЪЯСНИТЕ НОВИЧКУ. Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 24.11.2010, 15:30
Сообщение #2


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


Код приведи закрытия подключения и открытия нового.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 24.11.2010, 16:05
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(panter_dsd @ 24.11.2010, 15:30) *
Код приведи закрытия подключения и открытия нового.


private:
class QListWidget* list;
class QString namelist;
class QString namedb;
class QSqlDatabase db;
private slots:
       void listClicked();
/***************************/
//Добавляю имена из главной БД
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("masterdb");
    db.setHostName();
    db.setUserName("1");
    db.setPassword("1");
    if (!db.open()){
    db.lastError().text();
            }
    QSqlQueryModel model;
    model.setQuery("SELECT name FROM table");
    for (int i = 0; i < model.rowCount(); ++i) {
    namelist = model.record(i).value("name").toString();    
    list->addItem(namelist);
    }
/******************************/
void Action::listClicked()
{
    namedb=list->currentItem()->text();
    db.close();
    db.removeDatabase("QSQLITE");

    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(namedb.toUtf8());
    db.setHostName();
    db.setUserName("1");
    db.setPassword("1");
    if (!db.open()){
    db.lastError().text();
            }


Вроде все. Просто я там говнокода напечатал. ОЧЕНЬ МНОГО.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 24.11.2010, 16:50
Сообщение #4


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


Не храни db, ты всегда можешь его получить. Вот так примерно должно быть:
void Action::listClicked()
{
    const QString& namedb = list->currentItem()->text();
    QSqlDatabase db = QSqlDatabase::database ();
    db.close();
    db.setDatabaseName(namedb);
    db.setHostName();
    db.setUserName("1");
    db.setPassword("1");
    if (!db.open()){
    db.lastError().text();
            }


Сообщение отредактировал panter_dsd - 24.11.2010, 16:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 24.11.2010, 17:12
Сообщение #5


Студент
*

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

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




Репутация:   0  


В этой строке же нужно указать какой тип БД я хочу использовать?
QSqlDatabase db = QSqlDatabase::database ();

А в чем разница хранения?
Еще заметил такую проблему вроде создаю запароленные БД, а могу открыть их без пароля. Как правильно?
при создании
db.setUserName("1");
db.setPassword("1");

а при открытии так
db.open("1", "1");


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 24.11.2010, 17:15
Сообщение #6


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


SQLite не поддерживает пароли.

QSqlDatabase::database () - указатель на дефолтное подключение. Т.е. когда ты делаешь addDatabase создается соединение, к которому ты из любого участка программы сможешь получить доступ через QSqlDatabase::database (). Так же можешь задать имя соединению:
...................
QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE", "YOUR_CONNECTION);
.............................................
QSqlDatabase db = QSqlDatabase::database ("YOUR_CONNECTION);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 24.11.2010, 17:49
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(panter_dsd @ 24.11.2010, 17:15) *
...................
QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE", "YOUR_CONNECTION);
.............................................
QSqlDatabase db = QSqlDatabase::database ("YOUR_CONNECTION);

Помоему я чет не правильно делаю у меня с дефолтным подключением пишет что БД не открыта. Но суть не в этом.
Другими словами почему я подключаюсь к готовой БД SQLite и могу получить из нее данные, а дисконектнутся с ней и подключится к другой для просмотра данных у меня не получается (остается активна первая подключенная БД).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 24.11.2010, 17:51
Сообщение #8


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


Значит что-то ее держит. Модель какая-нибудь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 24.11.2010, 18:09
Сообщение #9


Студент
*

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

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




Репутация:   0  


Цитата(panter_dsd @ 24.11.2010, 18:51) *
Значит что-то ее держит. Модель какая-нибудь.

Это наверное самый правильный вариант. А как отрубить модель от базы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 24.11.2010, 20:01
Сообщение #10


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


Попробуй метод clear ().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.12.2024, 19:36