2015-05-15 3 views
0

В моем конструкторе (Qt 5.4.1 - Windows 7):Почему функция isOpen() всегда возвращает true?

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName(":memory:"); 
db.open(); 

QSqlQuery q; 
q.exec("create table authors(num integer, birthdate date)"); 
q.exec("insert into authors values('123', '2015-01-01')"); 
qDebug()<<"your info saved in db."; 

Каждые вещи не в порядке до сих пор, но, позже, мне нужно изменить свою БД и сохранить некоторые данные на постоянной основе, так:

int Dialog::SaveInfosPermanent() 
{ 

    QSqlDatabase::database().close(); 
    if (QSqlDatabase::database().isOpen()) { 
     qDebug()<<"DB is open."; 
     return 1; 
    } 

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("newDB.db"); 
    db.open(); 

    QSqlQuery q; 
    q.exec("create table authors(num integer, birthdate date)"); 
    q.exec("insert into authors values('123', '2015-01-01')"); 
    qDebug()<<"your info saved in db."; 

    return 0; 
} 

и выход:

your info saved in db. 
QSqlError("", "", "") 
DB is open. 

Так что я делаю неправильно? или есть другие идеи для изменения db из памяти на жесткий диск, если пользователь выбирает определенный флажок?

+4

Знаете ли вы, что QSqlDatabase :: database() 'по умолчанию будет также открывать соединение с БД? Если это не то, что вам нужно, вам нужно указать параметр 'open':' QSqlDatabase :: database («QSQLITE», false) .isOpen() ' –

ответ

0

Для меня лучший способ инициализировать соединение с базой данных, чтобы использовать имя соединения:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName); 

С именем соединения у вас есть некоторые дополнительные возможности. Удаления базы данных из списка соединений с базой данных, найти документы here:

QSqlDatabase::removeDatabase(connectionName); 

Получить доступ к базе данных по имени, найти Документы here:

QSqlDatabase db = QSqlDatabase::database(connectionName); 

В вашем случае использовании removeDatabase() с именем соединения, но не забывайте о области db. См. Пример в ссылке i attach.

Вы также можете использовать БД с тем же именем, как в случае, как docs говорит:

Добавляет базу данных в список соединений баз данных, используя тип драйвера и имя соединения ConnectionName. Если уже существует соединение базы данных с именем connectionName, это соединение будет удалено.

Соединение с базой данных называется connectionName. Возвращается новое подключение базы данных .

+0

Итак, что вы имеете в виду сейчас? Вы имеете в виду, что я не могу закрыть соединение с именем по умолчанию? – Musa

+0

Я имею в виду, что если вы не уверены, что ваше соединение близко, используйте безопасный способ сделать это –

Смежные вопросы