Базы данных |
Здравствуйте, гость ( Вход | Регистрация )
Базы данных |
dexter_man |
17.5.2008, 21:04
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 12.5.2008 Пользователь №: 173 Спасибо сказали: 0 раз(а) Репутация: 0 |
Тут такая проблема организовалась: есть две базы данных, одна создается в памяти, вторая берется из файла.
Доступ к этим базам нужен во всех классах программы. Каким образом такое можно организовать? Мож их нужно как-то глобально объявить? |
|
|
Litkevich Yuriy |
17.5.2008, 21:18
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Мож их нужно как-то глобально объявить? нет QSqlDatabase виден во всей программе, это особый класс, только их создать лучше так:
где строки "db_mem" и "db_file" - уникальные по всей программе имена соединений т.е. в других частях программы ты обращаешся к базе по имени соединения:
и не забудь когда будешь делать запросы с помощью QSqlQuery, определи БД, т.к. у тебя их две:
|
|
|
dexter_man |
17.5.2008, 21:24
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 12.5.2008 Пользователь №: 173 Спасибо сказали: 0 раз(а) Репутация: 0 |
получается, что в любой части программы (в любом классе) я могу сделать следующее:
Я правильно понял? А где указывать название базы? И еще вопрос, а базу нужно каким либо образом закрывать когда завершается работа программы? Сообщение отредактировал dexter_man - 17.5.2008, 21:21 |
|
|
Litkevich Yuriy |
17.5.2008, 21:31
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Я правильно понял? не совсем, гдето, ты создал соединение так:
в другом классе, чтобы получить доступ, тебе опять нужна переменная типа QSqlDatabase, но соединение уже создано и тебе нужно лишь использовать его:
И еще вопрос, а базу нужно каким либо образом закрывать когда завершается работа программы? да, ее и открвать надо! Я открываю так:
|
|
|
dexter_man |
17.5.2008, 21:34
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 12.5.2008 Пользователь №: 173 Спасибо сказали: 0 раз(а) Репутация: 0 |
Не, то что надо открывать эт я уже понял, а как тогда закрвать? Или закрывать все таки не надо?
PS Просто седня с 7 утра сижу за компом, уже ниче не соображаю Сообщение отредактировал dexter_man - 17.5.2008, 21:47 |
|
|
Litkevich Yuriy |
17.5.2008, 21:47
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
close() , я предпочитаю закрывать, может Qt и сама может это сделать при закрытии программы, я не вкурсе.
|
|
|
Arceny |
26.5.2008, 18:37
Сообщение
#7
|
Студент Группа: Участник Сообщений: 20 Регистрация: 15.4.2008 Из: Брянск Пользователь №: 149 Спасибо сказали: 0 раз(а) Репутация: 0 |
А как быть, если я в процессе работы программы хочу открыть новую БД (возможно даже другого типа, например QPSQL)? Пробовал close(),получаю при открытии ругань
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
|
|
|
Litkevich Yuriy |
26.5.2008, 19:04
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Цитата void QSqlDatabase::removeDatabase ( const QString & connectionName ) [static]
Removes the database connection connectionName from the list of database connections. Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur. |
|
|
Arceny |
26.5.2008, 19:17
Сообщение
#9
|
Студент Группа: Участник Сообщений: 20 Регистрация: 15.4.2008 Из: Брянск Пользователь №: 149 Спасибо сказали: 0 раз(а) Репутация: 0 |
У меня нет отпкрытых запросов. У меня вообще в моём приложении пока что их нет. БД просто открывается и закрывается (полностью, через QSqlDatabase::removeDatabase).
Я вообще вызываю db.close(); перед вызовом removeDatabase, который как написано в документации должен Closes the database connection, freeing any resources acquired, and invalidating any existing QSqlQuery objects that are used with the database. Сообщение отредактировал Arceny - 26.5.2008, 19:25 |
|
|
ViGOur |
26.5.2008, 20:16
Сообщение
#10
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Цитата Первый аргумент QSqlDatabase::addDatabase() - это имя драйвера. Для получения списка драйверов, см. документацию addDatabase(). Для инициализации данных соединения мы вызываем setHostName(), setDatabaseName(), setUserName() и setPassword(). Читаем: Модуль QtSql
Так как имя соединения не определено, соединение становится соединением по умолчанию. Для определения имени, передайте его в качестве второго аргумента в QSqlDatabase::addDatabase(). Например: Как только соединение инициализировано, мы должны вызвать QSqlDatabase::open() для открытия бызы данных и получения доступа к данным. Если запрос соединения потерпит неудачу, функция возвратит false; информацию об ошибке можно получить из QSqlDatabase::lastError().Как только соединение установлено, мы можем получить указатель на него из любого места прораммы, вызвав статическую функцию QSqlDatabase::database(). Если мы вызываем данную функцию без параметра, она возвратит указатель на соединение по умолчанию. Если функция вызывается с идентификатором, использованным при установке соединения, она возвратит ссылку на указанное соединение. Например:
Для удаления соединения с базой данных, сначала закройте базу данных с помощью QSqlDatabase::close(), а затем, удалите ее с помощью статического метода QSqlDatabase::removeDatabase(). |
|
|
Текстовая версия | Сейчас: 28.1.2025, 3:42 |