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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: как подключить базу данных и вывести информацию спомощью запроса sql?  (Прочитано 12859 раз)
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();
но не понимаю подключилась ли база данных на самом деле или нет...
Записан
Serr500
Гость
« Ответ #1 : Май 26, 2013, 12:01 »

но не понимаю подключилась ли база данных на самом деле или нет...
Ну так проверьте результат функции QSqlDatabase::open
Записан
thechicho
Гость
« Ответ #2 : Май 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();
}
« Последнее редактирование: Май 26, 2013, 13:30 от thechicho » Записан
lexflax
Гость
« Ответ #3 : Май 26, 2013, 14:58 »

взял часть из вашего кода объясните мне ее пожалуйста
db.setDatabaseName("cities");\\- эта строчка так понимаю подключение базы? надо указывать весь ее путь? или имя достаточно? сейчас я ее закинул в папку с самим проектом..........
 

//    QSqlQuery query;--- что означает эта строчка и под ней? для чего они служат? если простым и человеческим языком?
    //    query.exec("SELECT * FROM Города;");
Записан
thechicho
Гость
« Ответ #4 : Май 26, 2013, 15:15 »

//db.setDatabaseName("cities");\\- эта строчка так понимаю подключение базы? надо указывать весь ее путь? или имя достаточно?
а как вы думаете?

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

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

//задали на нем написать приложение к которому можно подключить базу данных которую я уже сделал в sqlite3
https://www.free-lance.ru/
http://www.prog.org.ru/board_67_0.html
Записан
lexflax
Гость
« Ответ #5 : Май 26, 2013, 16:39 »

ну как сделать чтоб результат запроса отобразился именно в компаненте каком нибудь? допустим Listviev
Записан
LEO
Гость
« Ответ #6 : Май 27, 2013, 08:00 »

прочитай про модели, именно модель ты и засовываешь во вью Подмигивающий
Записан
lexflax
Гость
« Ответ #7 : Май 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 который я так понимаю программа и подключает к себе... почему она вообще создает файл с таким же именем как моя база? вместо того чтоб подключать мою базу...
Записан
Serr500
Гость
« Ответ #8 : Май 28, 2013, 08:08 »

у меня допустим нету базы с именем cities , после запуска программы появляется файл пустой с таким именем... если вписываю свою базу fox, предварительно допавив ее в папку с проектом , то опять же после запуска программы появляется пустой файл с именем fox который я так понимаю программа и подключает к себе... почему она вообще создает файл с таким же именем как моя база? вместо того чтоб подключать мою базу...
патамучта дапавив сваю базу в папку с проектом праграмма иё нинайдёт! Если указывать только имя без пути, то поиск ведётся в рабочем (текущем) каталоге, а для Creator'а рабочий каталог обычно не совпадает с папкой исходников проекта, поскольку он создаёт так называемые "теневые сборки". Укажите полный путь к файлу или разместите файл в каталоге с бинарниками.
Записан
LEO
Гость
« Ответ #9 : Май 28, 2013, 08:20 »

если база в папке где программа то пропиши в подключении к базе
QApplication::applicationFilePath();
т.е. он сам будет искать базу в данной папке
Записан
thechicho
Гость
« Ответ #10 : Май 28, 2013, 10:02 »

потому, что ты не в тот универ поступил. надо было в школу милиции идти
http://music.yandex.ru/#!/track/1703858/album/168771

ты добавляешь так
Код:
db.setDatabaseName("fox");
а надо так
Код:
//у меня база данных называется fox.db
db.setDatabaseName("fox.db");
Записан
lexflax
Гость
« Ответ #11 : Май 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.
Даже если проверять если ли подключение или нет, то не факт что созданное подключение будет именно с моей базой а не тем файлом который появляется при запуске программы...
Записан
lexflax
Гость
« Ответ #12 : Май 28, 2013, 11:25 »

вот сам проект с базой, попробуйте сами....
Записан
LEO
Гость
« Ответ #13 : Май 28, 2013, 11:42 »

а как вы хотели?!?!?!?!
Записан
lexflax
Гость
« Ответ #14 : Май 28, 2013, 11:44 »

ну всмысле зачем он создает второй файл с таким же именем как у меня только пустой... разве так должно быть??
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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