Вставка данных Qt & SqlLite в базу данных

Я делаю приложение Qt. Я пытаюсь сохранить данные в базе данных. У меня проблема, потому что у меня есть соединение с sqlite3, но когда я хочу вставить данные, QT говорит, что QSqlQuery::prepare: база данных не открыта.

void DodajKontakt::on_btn_add_clicked()
{

    QSqlDatabase db_kon = QSqlDatabase::addDatabase("QSQLITE");
    db_kon.setDatabaseName("C:/Users/Lukasz/Desktop/qt master/organizator/baza_kontakty.db");

    QSqlQuery query;
    query.prepare( "CREATE TABLE kontakty(ids INTEGER PRIMARY KEY, name TEXT, surname TEXT, company TEXT, email TEXT, phone TEXT");

    if(!db_kon.open())
    {
        qDebug() << "error:" << db_kon.lastError().text();
    }
    else
        qDebug() << "Succsess";

    if(ui->lineEdit_name->text().isEmpty() && ui->lineEdit_surname->text().isEmpty()
            && ui->lineEdit_email->text().isEmpty() && ui->lineEdit_phone->text().isEmpty()
            && ui->lineEdit_company->text().isEmpty())
    {
        QMessageBox::critical(this, tr("Error"), tr("Uzupełnij wszystkie pola!"));

    }
    else
    {
        QString name, surname, company, email, phone;
        name = ui ->lineEdit_name->text();
        surname = ui ->lineEdit_surname->text();
        company = ui ->lineEdit_company->text();
        email = ui ->lineEdit_email->text();
        phone = ui ->lineEdit_phone->text();



        query.prepare("INSERT INTO kontakty(name,surname,company.email.phone) VALUES('"+name+"','"+surname+"','"+company+"','"+email+"','"+phone+"')");
        if(query.exec())
            QMessageBox::information(this, tr("Sukces"),tr("Dodano nowy kontakt"));
        else
            QMessageBox::information(this, tr("Error"),tr("Nie udalo sie dodac nowego kontaktu"));
    }
}

Это результаты.

QSqlQuery::prepare: database not open
Succsess

Кто-нибудь может мне помочь?

1 ответ

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

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

У вас также есть ошибки в запросе, например, при создании таблицы, которую нужно закрыть круглыми скобками.

И, наконец, не создавайте запрос напрямую, если вы собираетесь использовать данные, предоставленные пользователем, поскольку ваша система будет подвержена SQL-инъекциям, уместно использовать значение привязки.

QSqlDatabase db_kon = QSqlDatabase::addDatabase("QSQLITE");
db_kon.setDatabaseName("C:/Users/Lukasz/Desktop/qt master/organizator/baza_kontakty.db");

if(!db_kon.open()){
    qDebug() << "error:" << db_kon.lastError().text();
    return;
}

qDebug() << "Success";

QSqlQuery query;
query.prepare( "CREATE TABLE kontakty(ids INTEGER PRIMARY KEY, name TEXT, surname TEXT, company TEXT, email TEXT, phone TEXT)");

if(!query.exec()){
    qDebug()<<"error:" << query.lastError().text();
    return;
}

QString name = ui->lineEdit_name->text();
QString surname = ui->lineEdit_surname->text();
QString company = ui->lineEdit_company->text();
QString email = ui->lineEdit_email->text();
QString phone = ui->lineEdit_phone->text();

if(name.isEmpty() &&
        surname.isEmpty() &&
        email.isEmpty() &&
        phone.isEmpty() &&
        company.isEmpty())
{
    QMessageBox::critical(this, tr("Error"), tr("Complete all fields!"));
    return;
}

query.prepare("INSERT INTO kontakty(name, surname, company, email, phone) VALUES(?, ?, ?, ?, ?)");

query.addBindValue(name);
query.addBindValue(surname);
query.addBindValue(company);
query.addBindValue(email);
query.addBindValue(phone);

if(query.exec())
    QMessageBox::information(this, tr("Success"),tr(" A new contact has been added"));
else
    QMessageBox::information(this, tr("Error"),tr("It was not possible to add a new contact"));
Другие вопросы по тегам