Russian Qt Forum
Ноябрь 24, 2024, 03:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подключить базку?  (Прочитано 7530 раз)
KBAC
Гость
« : Декабрь 08, 2011, 22:15 »

Во-первых, не понятно почему в разных примерах зачастую пишут такой код
Код:
QSqlDatabase *db =  QSqlDatabase::addDatabase("QODBC");
Не работает он. Я пишу раздельно
Код:
QSqlDatabase *db =  new QSqlDatabase;
    db->addDatabase("QODBC");
Ну теперь к проблеме.
Код:
bool Connect() {
    QSqlDatabase *db =  new QSqlDatabase;
    db->addDatabase("QODBC");
    db->setHostName("DUDE-PC");
    db->setDatabaseName("Library");
    if (!db->open())
    {
        return false;
    }
    return true;
}
Функция лежит в файле .h Пишет "undefined reference to '_imp____ZN12QSqlDatabaseC1Ev'" Все заголовки необходимые подключены. И в другом файле ругается на QTableModel, пишет тоже подобное, т.е. в конце непонятной строчки также есть QSqlDatabase.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Декабрь 08, 2011, 22:19 »

В pro файле QT += sql
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BuRn
Гость
« Ответ #2 : Декабрь 08, 2011, 23:22 »

delete db; //сделай если база не открылась
Записан
KBAC
Гость
« Ответ #3 : Декабрь 09, 2011, 09:33 »

Спасибо, помогло. А еще, зачем создавать экземпляр QSqlDatabase, если он локальный и остается в пределах функции?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #4 : Декабрь 09, 2011, 09:35 »

Спасибо, помогло. А еще, зачем создавать экземпляр QSqlDatabase, если он локальный и остается в пределах функции?
Не нужно создавать.
QSqlDatabase db =  QSqlDatabase::addDatabase("QODBC");
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
KBAC
Гость
« Ответ #5 : Декабрь 09, 2011, 09:55 »

Пантер, ты ведь сделал то же самое, на мой взгляд. У тебя db тоже пропадет когда выйдем из функции, если конечно не возвращать его. Можно по-подробнее ,пжлст. 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #6 : Декабрь 09, 2011, 10:00 »

Сравни:
QSqlDatabase *db =  QSqlDatabase::addDatabase("QODBC");
QSqlDatabase db =  QSqlDatabase::addDatabase("QODBC");
QSqlDatabase - синглтон и добавленное соединение не исчезает пока ты его не удалишь вручную.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #7 : Декабрь 09, 2011, 10:02 »

Внимательнее посмотри как устроен QDatabase.

Если вкратце - то что то вроде синглетона - при addDatabase соединение (назовем это так) создается, но при удалении обьекта (который получен по addDatabase) -  соединение не рвется.
И в дальнейшем в любом месте ты можешь получить эту базу по QDatabase::database();

Тоесть не надо хранить указатель на базу изадаваться вопросами передачи его в функции и методы, а получать его по необходимости.

Насчет написания - имхо раздельно хуже.
Вначале ты делаешь пустой обьект, потом привязываешь его к драйверам. В другом же случае - ты сразу создаешь инициализированный объект.
(хотя тут стоит посмотреть исходники, может и однофигственно Подмигивающий )
Записан
KBAC
Гость
« Ответ #8 : Декабрь 09, 2011, 10:17 »

Тогда получается, что переменная db только для удобства написания, т.е. для сокращения количества кода. Можно ведь так писать
Код:
QSqlDatabase::addDatabase("QODBC");
QSqlDatabase::database().setHostName("tratata");
Т.е. вместо db очень много значков, но у нас освобождается чуть-чуть памяти.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #9 : Декабрь 09, 2011, 10:19 »

Да. Плюс не нужно постоянно дергать метод database ().
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Декабрь 09, 2011, 12:16 »

Т.е. вместо db очень много значков, но у нас освобождается чуть-чуть памяти.
На вызов функции память тоже нужна. Состояние регистров запомнить, значение параметра передать (хоть он тут и дефолтный).
Ну и такты на это тратятся.
Но скорее всего что память, что такты тут - экономия на спичках.
Записан
KBAC
Гость
« Ответ #11 : Декабрь 09, 2011, 13:40 »

Да, что-то не подумал про вызов database(). Использовать db все-таки, по-моему лучше будет.
Раз заговорили о затратах, меня уже долго волнует вопрос: На сколько затратно хранить ссылку?
Как я понимаю: ссылка - это второй идентификатор для какой-то адресной ячейки, и память должна тратиться лишь на хранение идентификатора. Если ссылка типа инт, тогда на ее хранение не надо 4 байта а намного меньше.

Если так, то можно было бы ссылку создать на database(); и все будет еще шоколаднее.
« Последнее редактирование: Декабрь 09, 2011, 13:46 от KBAC » Записан
KBAC
Гость
« Ответ #12 : Декабрь 10, 2011, 20:27 »

При подключении в setUser и setPassword надо писать данные для windows идентификации? подключение к SQL Server. И как поглядеть почему не подключается? Шаг с заходом почему-то не работает для QSqlDatabase::open().
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #13 : Декабрь 12, 2011, 07:40 »

db.lastError ().text () покажет тебе ошибку.
Логин и пароль нужно указывать к SQL Server.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.