crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QSQLITE, создание/подключение к БД
Litkevich Yuriy
  опции профиля:
сообщение 29.4.2008, 7:27
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Тут обнаружил такую штуку, никогда со встраиваемыми БД не работал с SQLITE в том числе.
если написать такие строчки кода:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("app.db");

то если БД нет то будет создана, нашел это удобным, но не всегда.
Можно ли проверить существует БД или нет?

Как вариант проверять наличие файла, но хотел средствами для работы с БД.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 29.4.2008, 7:34
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Ну самой-то SQLite можно указать и другое поведение. Но вот можно ли это через драйвер Qt...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Frigolem
  опции профиля:
сообщение 3.5.2009, 21:15
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 24.9.2008
Пользователь №: 297

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




Репутация:   0  


Само ядро (sqlite3.c), на которое ссылается драйвер, воспринимает имя БД как имя файла и напрямую использует его всюду.

Qt'шный драйвер sqlite использует при открытии БД метод sqlite_open16, который не подразумевает передачу параметров открытия... :unsure:
При этом рядом стоящая альтернативная функция sqlite_open_v2 позволяет в качестве аргумента задать режим SQLITE_OPEN_READONLY (вместо SQLITE_OPEN_READWRITE) и таким образом получить ошибку при попытке открытия несуществующей БД.
Для _open16 видимо ещё не реализовали.

Наверно разработчики ядра не сильно об этом парятся, так как имя БД напрямую используют как имя файла.
Возможно и нам пока что не стоит... :huh:


Также есть один косвенный метод -- использовать QSqlDatabase::tables
Она возвращает список таблиц в БД. Соответственно в новосозданной БД таблиц быть не должно. :)
Жаль только, что таки как минимум оставляет после себя сделанный файл БД (с размером в 0 байт), если такового не было... :unsure:

Вот примерчик:
    // Тестовые ведьмовста
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName( "default.db" );
    if( !db.open() )
    {
        qDebug() << "Ne smoglo otkryt: " << db.lastError();
    }
    else
    {
        if( db.tables().isEmpty() )
        {
        qDebug() << "NEMA";
        }
        else
        {
        qDebug() << "Chto-to est";
        }
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.5.2009, 5:57
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Frigolem, я эту проблему иначе решил, просто проверяю существует ли файл, средствами QFile.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.9.2018, 16:49