Russian Qt Forum

Qt => Базы данных => Тема начата: lexflax от Май 26, 2013, 11:56



Название: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 26, 2013, 11:56
Доброго времени суток...
Никогда раньше в qt qreator не работал, задали на нем написать приложение к которому можно подключить базу данных которую я уже сделал в sqlite3... Как в нем подлючается база данных не знаю... посмотрел много разной литературы но толком суть не понял как это делается... у меня база данных называется fox.db , вид допустим такой -приложение должно  по нажатию кнопки подключается база и выполняется запрос который допустим в компоненте LineEdit я буду писать... и результат запроса отображается на каком нибудь другом компоненте... подскажите как это реализовать собственно нужен сам код...
Нашел такой по подлючению базы...
void MainWindow::on_pushButton_clicked()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("fox");

        bool b =  db.open();
но не понимаю подключилась ли база данных на самом деле или нет...


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: Serr500 от Май 26, 2013, 12:01
но не понимаю подключилась ли база данных на самом деле или нет...
Ну так проверьте результат функции QSqlDatabase::open (http://qt-project.org/doc/qt-4.8/qsqldatabase.html#open)


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: thechicho от Май 26, 2013, 13:27
я как раз ща работаю с бд.
такой код использую:

Код:
QSqlDatabase db = QSqlDatabase::database();
    if (db.connectionName().isEmpty()) db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("cities");
    if (!db.open()) {
        QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
        return;
    }

//    QSqlQuery query;
    //    query.exec("SELECT * FROM Города;");

    //    int fieldCity = query.record().indexOf("Город");
    //    int fieldId = query.record().indexOf("Ид");
    //    int fieldCountry = query.record().indexOf("Страна");
    //    int fieldRegion = query.record().indexOf("Регион");

    //    qDebug() << endl << "fieldCity" << fieldCity;
    //    qDebug() << "fieldId" << fieldId;
    //    qDebug() << "fieldCountry" << fieldCountry;
    //    qDebug() << "fieldRegion" << fieldRegion;

    //    City city;
    //    QList<City> cities;

    //    while (query.next()) {
    //        city.name = query.value(fieldCity).toString();
    //        city.id = query.value(fieldId).toString();
    //        city.country = query.value(fieldCountry).toString();
    //        city.region = query.value(fieldRegion).toString();

    //        qDebug() << "City" << city.name << "Id" << city.id << "Country" << city.country << "Region" << city.region;
    //        cities.append(city);
    //    }

единожды выполнив соединение с бд и ее открытие, до тех пор пока бд явно не закрыта
Код:
db.close();

можно в любом методе класса работать с бд таким образом:
Код:
QSqlQuery query;

    if (!city.isEmpty()) {
        query.exec("SELECT * FROM Города WHERE Город='" + city + "' AND Страна='" + country + "' AND Регион='" + region + "';");
    } else if (!region.isEmpty()) {
        query.exec("SELECT * FROM Регионы WHERE Регион='" + region + "' AND Страна='" + country + "';");
        city = country + ", " + region;
    } else if (!country.isEmpty()) {
        query.exec("SELECT * FROM Страны WHERE Страна='" + country + "';");
        city = country;
    }

    if (!query.first()) {
        query.exec("SELECT * FROM Метро WHERE Метро='" + city + "' AND Страна='" + country + "' AND Город='" + region + "';");
        if (query.first())
            city = region + " (" + city + ")";
    }
    QString id = query.value(query.record().indexOf("Ид")).toString();

    qDebug() << endl << "city" << city << "id" << id << "country" << country << "region" << region;

но если вы явно закроете бд, то придется делать так:
Код:
QSqlDatabase db = QSqlDatabase::database();
    if (db.connectionName().isEmpty()) db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("cities");
    if (!db.open()) {
        QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
        return;
    }

    QSqlQuery query;
    foreach (QString cityTmp, citiesInsert) {
        QStringList cityParts = cityTmp.split("|");
        if (cityParts.count() >= 4) {
            QString city = cityParts.at(0);
            QString id = cityParts.at(1);
            QString country = cityParts.at(2);
            QString region = cityParts.at(3);

            query.exec("INSERT INTO Города(Город, Ид, Страна, Регион) VALUES ('" + city + "', '" + id + "', '" + country + "', '" + region + "');");
            //query.exec("INSERT INTO Метро(Метро, Ид, Страна, Регион) VALUES ('" + city + "', '" + id + "', '" + country + "', '" + region + "');");
        }
    }

я работаю с бд в динамически создаваемом диалоге, поэтому у меня бд открыта пока не закрыт диалог.
закрывается ли бд, при уничтожении db, когда тот выходит из области видимости стека, я точно не знаю.
универсально, в каждый метод где нужна бд, добавить:
Код:
QSqlDatabase db = QSqlDatabase::database();
    if (db.connectionName().isEmpty()) db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("cities");
    if (!db.open()) {
        QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
        return;
    }

и таким образом делать запросы:
Код:
QSqlQuery query;
query.exec("SELECT * FROM Города;");

int fieldCity = query.record().indexOf("Город");
int fieldId = query.record().indexOf("Ид");
int fieldCountry = query.record().indexOf("Страна");
int fieldRegion = query.record().indexOf("Регион");

qDebug() << endl << "fieldCity" << fieldCity;
qDebug() << "fieldId" << fieldId;
qDebug() << "fieldCountry" << fieldCountry;
qDebug() << "fieldRegion" << fieldRegion;

while (query.next()) {
    qDebug() << "city" << query.value(fieldCity).toString() << "id" << query.value(fieldId).toString() << "country" << query.value(fieldCountry).toString() << "region" << query.value(fieldRegion).toString();
}


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 26, 2013, 14:58
взял часть из вашего кода объясните мне ее пожалуйста
db.setDatabaseName("cities");\\- эта строчка так понимаю подключение базы? надо указывать весь ее путь? или имя достаточно? сейчас я ее закинул в папку с самим проектом..........
 

//    QSqlQuery query;--- что означает эта строчка и под ней? для чего они служат? если простым и человеческим языком?
    //    query.exec("SELECT * FROM Города;");


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: thechicho от Май 26, 2013, 15:15
//db.setDatabaseName("cities");\\- эта строчка так понимаю подключение базы? надо указывать весь ее путь? или имя достаточно?
а как вы думаете?

//QSqlQuery query;
это означает создание объекта класса QSqlQuery с именем query :D
//query.exec("SELECT * FROM Города;");
это означает вызов метода exec() класса QSqlQuery с параметром "SELECT * FROM Города;"  :D

ппц нубы пошли, даешь готовый код, не понимают элементарных вещей :-\

//задали на нем написать приложение к которому можно подключить базу данных которую я уже сделал в sqlite3
https://www.free-lance.ru/
http://www.prog.org.ru/board_67_0.html


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 26, 2013, 16:39
ну как сделать чтоб результат запроса отобразился именно в компаненте каком нибудь? допустим Listviev


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: LEO от Май 27, 2013, 08:00
прочитай про модели, именно модель ты и засовываешь во вью ;)


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 06:28
thechicho у вас в первом коде есть строчка подключения базы выглядит так
QSqlDatabase db = QSqlDatabase::database();
     db = QSqlDatabase::addDatabase("QSQLITE");

        db.setDatabaseName("cities");
        if (!db.open()) {
            QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
            return;
        }
у меня допустим нету базы с именем cities , после запуска программы появляется файл пустой с таким именем... если вписываю свою базу fox, предварительно допавив ее в папку с проектом , то опять же после запуска программы появляется пустой файл с именем fox который я так понимаю программа и подключает к себе... почему она вообще создает файл с таким же именем как моя база? вместо того чтоб подключать мою базу...


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: Serr500 от Май 28, 2013, 08:08
у меня допустим нету базы с именем cities , после запуска программы появляется файл пустой с таким именем... если вписываю свою базу fox, предварительно допавив ее в папку с проектом , то опять же после запуска программы появляется пустой файл с именем fox который я так понимаю программа и подключает к себе... почему она вообще создает файл с таким же именем как моя база? вместо того чтоб подключать мою базу...
патамучта дапавив сваю базу в папку с проектом праграмма иё нинайдёт! Если указывать только имя без пути, то поиск ведётся в рабочем (текущем) каталоге, а для Creator'а рабочий каталог обычно не совпадает с папкой исходников проекта, поскольку он создаёт так называемые "теневые сборки". Укажите полный путь к файлу или разместите файл в каталоге с бинарниками.


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: LEO от Май 28, 2013, 08:20
если база в папке где программа то пропиши в подключении к базе
QApplication::applicationFilePath();
т.е. он сам будет искать базу в данной папке


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: thechicho от Май 28, 2013, 10:02
потому, что ты не в тот универ поступил. надо было в школу милиции идти
http://music.yandex.ru/#!/track/1703858/album/168771 (http://music.yandex.ru/#!/track/1703858/album/168771)

ты добавляешь так
Код:
db.setDatabaseName("fox");
а надо так
Код:
//у меня база данных называется fox.db
db.setDatabaseName("fox.db");


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 10:30
прописал весь путь к базе...
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("C:/Users/Алексей/Desktop/sqlite3/fox");
        db.open();
так же пробовал и с расширением QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("C:/Users/Алексей/Desktop/sqlite3/fox.db");
        db.open();

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


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 11:25
вот сам проект с базой, попробуйте сами....


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: LEO от Май 28, 2013, 11:42
а как вы хотели?!?!?!?!


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 11:44
ну всмысле зачем он создает второй файл с таким же именем как у меня только пустой... разве так должно быть??


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 11:46
1--- мне надо подключить базу
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("C:/Users/Алексей/Desktop/sqlite3/fox.db");
        db.open();
2----потом в базу отправить запрос к таблице kod;
QSqlQuery query;
query.exec("SELECT * from kod");
3---- вывести результат запроса в какой нибудь компонент желательно на форме размещенный ... вот три этих пункта я не знаю как выполнить...
Все мое обучение заочное это получение заданий и решение их только через интернет,тоесть группы у меня нету... лекций нету... полное самообоучение через интернет... может у кого то хорошо полностью самостоятельно получается обучатся у меня ну так как есть... но делать все равно надо... Если кто из вас прям хорошо понимает то поясните наглядно если не лень то попробуйте со мной это задание сделать...


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: Serr500 от Май 28, 2013, 11:54
он создает второй файл с таким же именем как у меня только пустой...
В одной папке не может быть двух объектов с одинаковыми именами. У вас файл называется "fox.db;". Уберите точку с запятой в конце имени.


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: LEO от Май 28, 2013, 12:55
...


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 15:15
за подсказу с точкой запятой спасибо большое.... действительно визуально не заметил...
по коду LEO все запускается... только после запуска нажимаю на кнопку и результат запроса на форму не выводится...


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: Serr500 от Май 28, 2013, 15:16
А полный путь кто указывать будет? Если прописать, то всё нормально работает.
Код:
    db.setDatabaseName("d:\\Temp\\untitled1\\fox.db3");


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: thechicho от Май 28, 2013, 15:21
//Если кто из вас прям хорошо понимает то поясните наглядно если не лень то попробуйте со мной это задание сделать...
да походу только тебе лень. подумать. головой.


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 28, 2013, 15:30
да мне не лень... все запустилось) дальше с кнопками и синглами попробую по возится... препод по почте час назад практические прислал))) ура))) может из них часть материала возму))) спасибо) не судите строго)


Название: Re: как подключить базу данных и вывести информацию спомощью запроса sql?
Отправлено: lexflax от Май 29, 2013, 16:15
И снова здравствуйте))))
зашел еще раз сказать спасибо тем кто помог и просто показать то что получилось )))
Может у кого будет тоже задание такое и ему это поможет)))
Остался последний пунк сделать отчет через программу eXaro... С ней наверно придется повозится но по ней завтра почитаю и по разбираюсь)