Russian Qt Forum

Qt => Базы данных => Тема начата: KBAC от Декабрь 08, 2011, 22:15



Название: Как подключить базку?
Отправлено: 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.


Название: Re: Как подключить базку?
Отправлено: Пантер от Декабрь 08, 2011, 22:19
В pro файле QT += sql


Название: Re: Как подключить базку?
Отправлено: BuRn от Декабрь 08, 2011, 23:22
delete db; //сделай если база не открылась


Название: Re: Как подключить базку?
Отправлено: KBAC от Декабрь 09, 2011, 09:33
Спасибо, помогло. А еще, зачем создавать экземпляр QSqlDatabase, если он локальный и остается в пределах функции?


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


Название: Re: Как подключить базку?
Отправлено: KBAC от Декабрь 09, 2011, 09:55
Пантер, ты ведь сделал то же самое, на мой взгляд. У тебя db тоже пропадет когда выйдем из функции, если конечно не возвращать его. Можно по-подробнее ,пжлст. 


Название: Re: Как подключить базку?
Отправлено: Пантер от Декабрь 09, 2011, 10:00
Сравни:
QSqlDatabase *db =  QSqlDatabase::addDatabase("QODBC");
QSqlDatabase db =  QSqlDatabase::addDatabase("QODBC");
QSqlDatabase - синглтон и добавленное соединение не исчезает пока ты его не удалишь вручную.


Название: Re: Как подключить базку?
Отправлено: joker от Декабрь 09, 2011, 10:02
Внимательнее посмотри как устроен QDatabase.

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

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

Насчет написания - имхо раздельно хуже.
Вначале ты делаешь пустой обьект, потом привязываешь его к драйверам. В другом же случае - ты сразу создаешь инициализированный объект.
(хотя тут стоит посмотреть исходники, может и однофигственно ;) )


Название: Re: Как подключить базку?
Отправлено: KBAC от Декабрь 09, 2011, 10:17
Тогда получается, что переменная db только для удобства написания, т.е. для сокращения количества кода. Можно ведь так писать
Код:
QSqlDatabase::addDatabase("QODBC");
QSqlDatabase::database().setHostName("tratata");
Т.е. вместо db очень много значков, но у нас освобождается чуть-чуть памяти.


Название: Re: Как подключить базку?
Отправлено: Пантер от Декабрь 09, 2011, 10:19
Да. Плюс не нужно постоянно дергать метод database ().


Название: Re: Как подключить базку?
Отправлено: LisandreL от Декабрь 09, 2011, 12:16
Т.е. вместо db очень много значков, но у нас освобождается чуть-чуть памяти.
На вызов функции память тоже нужна. Состояние регистров запомнить, значение параметра передать (хоть он тут и дефолтный).
Ну и такты на это тратятся.
Но скорее всего что память, что такты тут - экономия на спичках.


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

Если так, то можно было бы ссылку создать на database(); и все будет еще шоколаднее.


Название: Re: Как подключить базку?
Отправлено: KBAC от Декабрь 10, 2011, 20:27
При подключении в setUser и setPassword надо писать данные для windows идентификации? подключение к SQL Server. И как поглядеть почему не подключается? Шаг с заходом почему-то не работает для QSqlDatabase::open().


Название: Re: Как подключить базку?
Отправлено: Пантер от Декабрь 12, 2011, 07:40
db.lastError ().text () покажет тебе ошибку.
Логин и пароль нужно указывать к SQL Server.