2014-10-16 8 views
1

У меня возникли проблемы с попыткой подключения к двум различным базам данных в одном приложении Qt. У меня есть моя база данных, в которой хранится вся информация, собранная приложением, и новая база данных журнала, которая позволяет мне отслеживать все изменения, которые происходят с Приложением, нажатия кнопок, загрузки экрана и т. Д., Для легкой отладки после ее выпуска. Отдельно базы данных работают отлично, но когда я пытаюсь использовать их оба, будет работать только один. Я читал, что это может быть связано с тем, что я не назвал соединения, и, очевидно, только последняя подключенная база данных могла использовать соединение по умолчанию. Однако, когда я даю имена баз данных они не будут работать вообще, IsOpen() возвращает истину на обоих, но как только они пытаются выполнить запрос, я получаю ошибкиQSqlDatabase Подключение к нескольким базам данных

"QSqlQuery::prepare: database not open" 

"QSqlError(-1, "Driver not loaded", "Driver not loaded")" 

Мои объявления двух баз данных:

database_location = filepath.append("/logger.sqlite"); 
logDB = QSqlDatabase::addDatabase("QSQLITE", "LoggerDatabaseConnection"); 
logDB.setHostName("localhost"); 
logDB.setDatabaseName(database_location); 

для подключения к базе данных Logger и:

database_location = filepath.append("/db.sqlite"); 
db = QSqlDatabase::addDatabase("QSQLITE", "NormalDB"); 
db.setHostName("localhost"); 
db.setDatabaseName(database_location); 

Кроме того, когда я бегу первый запрос на базы данных, чтобы увидеть, если их таблицы существуют, я использую

QSqlQuery query("LoggerDatabaseConnection"); 

, а также для нормальной базы данных, но я все еще получаю проблемы с подключением даже после объявления подключения к базе данных для запуска запроса.

База данных, используемая для приложения, объявлена ​​как статическая QSqlDatabase в пространстве имен для создания глобального эффекта, поэтому каждый может получить к ней доступ, это был предыдущий программист, и я создал базу данных журнала как Singleton с подключением к частной базе данных , Как я уже сказал, обе версии кода работают отдельно, но когда они вместе, они борются друг с другом. Я знаю, что есть огромная дискуссия о правильном дизайне Singleton vs Dependecy Injection, но опять же код работает отдельно, поэтому я доволен тем, как он разработан на данный момент. Если есть какая-либо недостающая информация или у вас есть какие-либо идеи, сообщите мне. Спасибо.

ответ

3
QSqlQuery query("LoggerDatabaseConnection"); 

Первый параметр конструктора - это запрос, а не имя соединения. Он будет использовать соединение по умолчанию, так как вы не указали объект базы данных.

Попробуйте что-то вроде этого:

QSqlQuery query1("YourFirstQuery", db); 
QSqlQuery query2("YourSecondQuery", logDB); 

Важной: Также не забудьте открыть и до закрытия базы данных/после использования его вызовов QSqlDatabase::open() и QSqlDatabase::close().

+0

Я закончил тем, что просто объединил базу данных с регистратором, чего я старался избегать, чтобы сохранить все модульное. Тем не менее, я начал тестовый проект с двумя подключениями к базе данных и использовал предложенный вами синтаксис, и, похоже, он, наконец, работает. Спасибо вам большое за ваше время. – JordanTSI