• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Qt] [C++] Dodawanie danych do bazy danych

VPS Starter Arubacloud
0 głosów
205 wizyt
pytanie zadane 13 września 2020 w C i C++ przez mm Użytkownik (890 p.)

Hej,

Mam taki problem z moim programem piszę w Qt w C++ program i chciałabym dodać do bazy danych elementy mam następujący kod i po wpisaniu danych do Line Edit i kliknięciu przycisku nic nie dodaje się do tabeli:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlTableModel>
#include <QTableView>
#include <QListWidget>
#include <QStringList>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    baza= QSqlDatabase::addDatabase("QSQLITE");
    baza.setDatabaseName("Magazyn.db");
    if(baza.open())
    {
        ui->lineEdit->setText("Polaczono");

    }
    else{
        ui->lineEdit->setText("Blad polaczenia");
    }

}
/*void MainWindow::readRecordsToListWidget(){

    QSqlQuery zapytanie(baza);
    if (zapytanie.exec("SELECT * FROM Klienci")){
            while(zapytanie.next()){
                ui->records->addItem(new QListWidgetItem(zapytanie.value(0).toString() + "\"" +
                 zapytanie.value(1).toString() + "\"" + zapytanie.value(2).toString() + "\"" +
                 zapytanie.value(3).toString() + "\"" + zapytanie.value(4).toString() + "\""+
                 zapytanie.value(5).toString() + "\"" + zapytanie.value(6).toString() + "\""+
                 zapytanie.value(7).toString() + "\"" ));
            }
}

}*/


/*void MainWindow::wypisywanie(){
    QSqlTableModel  *model=new QSqlTableModel;
    model->setTable("Klienci");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0,Qt::Horizontal,tr("Nazwa"));
    model->setHeaderData(1,Qt::Horizontal,tr("Typ danych"));

    QTableView *view=new QTableView;
    view->setModel(model);
    view->hideColumn(0);
    view->show();

}*/


/*void MainWindow::on_pushButton_2_clicked()
{
    QSqlQuery zapytanie;
    int wiersze=0;
    int kolumny= zapytanie.record().count();
    ui->listWidget->setColumnCount(kolumny);

    QString tekst =ui->textEdit->toPlainText();
    bool sukces=zapytanie.exec(tekst);
    if(sukces){
     ui->lineEdit->setText("OK");
  }
    else{
         ui->lineEdit->setText("Błedne zapytanie");
    }

   while(zapytanie.next()){
        ui->tableWidget->insertRow(wiersze);
        for(int i=0;i<kolumny;i++){
     ui->tableWidget->setItem(wiersze,kolumny,new QTableWidgetItem("ID"));

        }
     ui->tableWidget->setRowCount(wiersze);
     ui->tableWidget->item(wiersze,kolumny);
    }
  }*/


void MainWindow::on_pushButton_3_clicked()
{
    QString nazwa_firmy=ui->lineEdit_2->text();
    QString NIP= ui->lineEdit_3->text();
    QString imie= ui->lineEdit_4->text();
    QString nazwisko= ui->lineEdit_5->text();
    QString ulica= ui->lineEdit_6->text();
    QString kod_pocztowy= ui->lineEdit_7->text();
    QString miasto= ui->lineEdit_8->text();

    QSqlQuery zapytanie;
    zapytanie.prepare("INSERT INTO Klienci (Nazwa_firmy, NIP, Imie, Nazwisko, Ulica, Kod_pocztowy, Miasto) VALUES (:Nazwa, :NIP, :Imie, :Nazwisko, :Ulica, :Kod, :Miasto);");
    zapytanie.bindValue(":Nazwa", nazwa_firmy);
    zapytanie.bindValue(":NIP", NIP);
    zapytanie.bindValue(":Imie", imie);
    zapytanie.bindValue(":Nazwisko", nazwisko);
    zapytanie.bindValue(":Ulica", ulica);
    zapytanie.bindValue(":Kod", kod_pocztowy);
    zapytanie.bindValue(":Miasto", miasto);
    zapytanie.exec() ;


}
    /*QString t= "INSERT INTO Klienci (Nazwa_firmy, NIP, Imie, Nazwisko, Ulica, Kod_pocztowy, Miasto) VALUES ('";
    t += nazwa_firmy;
    t += "',";
    t += NIP;
    t +=",";
    t += imie;
    t +=",";
    t += nazwisko;
    t +=",";
    t += ulica;
    t += ",";
    t += kod_pocztowy;
    t += ",";
    t += miasto;
    t +=");";
    QSqlQuery zapytanie;
    zapytanie.exec(t);


}*/

void MainWindow::on_pushButton_4_clicked()
{
    QString nazwa = ui->lineEdit_9->text();
    QString ilosc = ui->lineEdit_10->text();
    QString cena = ui->lineEdit_11->text();

    QSqlQuery zapytanie;
    zapytanie.prepare("INSERT INTO stan_magazynowy (nazwa_produktu, ilosc, cena) VALUES (:nazwa, :ilosc, :cena);");
    zapytanie.addBindValue(nazwa);
    zapytanie.addBindValue(ilosc);
    zapytanie.addBindValue(cena);
    zapytanie.exec();
}

 

komentarz 13 września 2020 przez tangarr Mędrzec (154,780 p.)

Spróbuj wyświetlić błąd kwerendy.

if (!zapytanie.exec()) {
    qDebug() << zapytanie.lastError();
}
komentarz 13 września 2020 przez mm Użytkownik (890 p.)

Wyświetlił mi się następujący błąd: 

QMetaObject::connectSlotsByName: No matching signal for on_comboBox_activated(QString)
QSqlError("", "Parameter count mismatch", "")
QSqlError("", "Parameter count mismatch", "")
QSqlError("", "Parameter count mismatch", "")

 

1 odpowiedź

0 głosów
odpowiedź 13 września 2020 przez tangarr Mędrzec (154,780 p.)

Pomieszałeś dwa sposoby bindowania danych.
 

    QSqlQuery zapytanie;
    zapytanie.prepare("INSERT INTO stan_magazynowy (nazwa_produktu, ilosc, cena) VALUES (:nazwa, :ilosc, :cena);");
    zapytanie.addBindValue(nazwa);
    zapytanie.addBindValue(ilosc);
    zapytanie.addBindValue(cena);
    zapytanie.exec();

Zmień wywołania addBindValue na bindValue (tak jak w funkcji on_pushButton_3_clicked()) lub zmień "(:nazwa, :ilosc, :cena)" na "(?,?,?)"

komentarz 13 września 2020 przez mm Użytkownik (890 p.)
void MainWindow::on_pushButton_4_clicked()
{

    QString nazwa = ui->lineEdit_9->text();
    QString ilosc = ui->lineEdit_10->text();
    QString cena = ui->lineEdit_11->text();
    int iloscInt= ilosc.toInt();
    int cenaDouble= cena.toDouble();


    QSqlQuery zapytanie;
    zapytanie.prepare("INSERT INTO stan_magazynowy(nazwa_produktu,ilosc,cena) VALUES (?,?,?);");
    zapytanie.addBindValue(nazwa);
    zapytanie.addBindValue(ilosc);
    zapytanie.addBindValue( cena);
    zapytanie.exec();
    if (!zapytanie.exec()) {
        qDebug() << zapytanie.lastError();
        qDebug() << zapytanie.lastQuery();
        qDebug() << zapytanie.boundValues();
    }
}

Zrobiłam tak jak napisałeś i nadal jest to samo

komentarz 13 września 2020 przez tangarr Mędrzec (154,780 p.)

Cały czas używasz starych zmiennych ilosc i cena.

void MainWindow::on_pushButton_4_clicked()
{
    QString nazwa = ui->lineEdit_9->text();
    QString ilosc = ui->lineEdit_10->text();
    QString cena = ui->lineEdit_11->text();
    int iloscInt= ilosc.toInt();
    double cenaDouble= cena.toDouble();
 
 
    QSqlQuery zapytanie;
    zapytanie.prepare("INSERT INTO stan_magazynowy(nazwa_produktu,ilosc,cena) VALUES (?,?,?);");
    zapytanie.addBindValue(nazwa);
    zapytanie.addBindValue(iloscInt);
    zapytanie.addBindValue(cenaDouble);
    zapytanie.exec();
    if (!zapytanie.exec()) {
        qDebug() << zapytanie.lastError();
        qDebug() << zapytanie.lastQuery();
        qDebug() << zapytanie.boundValues();
    }
}

 

komentarz 13 września 2020 przez mm Użytkownik (890 p.)
Nadal to samo :(
komentarz 13 września 2020 przez tangarr Mędrzec (154,780 p.)

Być może sterownik sqlite nie obsługuje parametrów nienazwanych .
Przerób kod na podobny jak w funkcji on_pushButton_3_clicked()
 

void MainWindow::on_pushButton_4_clicked()
{
    QString nazwa = ui->lineEdit_9->text();
    QString ilosc = ui->lineEdit_10->text();
    QString cena = ui->lineEdit_11->text();
    int iloscInt= ilosc.toInt();
    double cenaDouble= cena.toDouble();
  
  
    QSqlQuery zapytanie;
    zapytanie.prepare("INSERT INTO stan_magazynowy(nazwa_produktu,ilosc,cena) VALUES (:nazwa, :ilosc, :cena);");
    zapytanie.bindValue(":nazwa", nazwa);
    zapytanie.bindValue(":ilosc", iloscInt);
    zapytanie.bindValue(":cena", cenaDouble);
    zapytanie.exec();
    if (!zapytanie.exec()) {
        qDebug() << zapytanie.lastError();
        qDebug() << zapytanie.lastQuery();
        qDebug() << zapytanie.boundValues();
    }
}

 

komentarz 14 września 2020 przez mm Użytkownik (890 p.)
Zmieniłam tak jak napisałeś i nic się nie zmieniło, nadal wywala ten sam błąd

Podobne pytania

0 głosów
0 odpowiedzi 127 wizyt
pytanie zadane 30 grudnia 2016 w C i C++ przez piter600 Użytkownik (610 p.)
0 głosów
1 odpowiedź 348 wizyt
pytanie zadane 14 sierpnia 2015 w C i C++ przez Rogargol Pasjonat (16,600 p.)
+1 głos
1 odpowiedź 547 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez budyb Nowicjusz (150 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...