Qt - Как использовать SQL SELECT COUNT с параметрами? - PullRequest
0 голосов
/ 13 января 2019

Я пишу программу на QT и у меня проблема с написанием SQL-запроса. Выберите. У меня есть простая таблица, которая содержит столбцы, такие как: ID, name_or_nickname, фамилия, род занятий. У меня есть 3 переменные, которые я хочу использовать в запросе:

QString name = "Peter";
QString surname = "Smith"; 
QString occupation = "New York";

Я хочу выполнить этот запрос, используя эти переменные:

 QSqlDatabase sql;                                                 
 QSqlQuery query(sql);
 QString execute = "SELECT COUNT(name) FROM table1 WHERE name_or_nickname='?' AND surname='?' AND occupation='?';";
        query.prepare(execute);
        query.bindValue(0, name);
        query.bindValue(1, _surname);
        query.bindValue(2, _occupation);
        query.exec();

        if (query.next()) 
        {
            rows= query.value(0).toInt();
            return true;
        } 
        else 
        {
            qDebug() << query.lastError();
            return false;
        }

Однако это не работает, и функция isActive () возвращает false, поэтому с запросом что-то не так - возможно, в скобках. Не могли бы вы показать мне пример, как я должен иметь дело с этим? Заранее спасибо!

=============================================== ============================

Выкладываю сюда необходимый код:

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <person.h>
#include <QMainWindow>
#include <QString>
#include <QtDebug>
#include <QtSql>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_1_clicked();

private:
    Ui::MainWindow *ui;

    QSqlDatabase sql;
    bool open_or_not;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    sql = QSqlDatabase::addDatabase("QSQLITE", "db");
    sql.setDatabaseName("E:\\folder\\database.sqlite3");
    sql.close(); // this was called beacuse of the problem with first query
    sql.open();

    QSqlQuery query(sql);
    QString execute = "CREATE TABLE IF NOT EXISTS table1 (id INTEGER UNIQUE PRIMARY KEY, name_or_nickname TEXT, surname TEXT, occupation TEXT);";
query.exec(execute);
    qDebug() << "isActive: CREATING TABLE" << query.isActive();
    query.clear();

    open_or_not = sql.open();

}

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

void MainWindow::on_pushButton_1_clicked()
{
    if(open_or_not)
    {
        Person person1(_sql, Johnny, Walker, California, this);
        bool result = false;
        result = person1.search_in_database();
        qDebug() << result;
    }
}

Person.h:

#ifndef PERSON_H
#define PERSON_H

#include <QNetworkRequest>
#include <QNetworkReply>
#include <QtDebug>
#include <QDebug>
#include <QJsonDocument>
#include <QtSql>

namespace Ui {
class Person;
}

class Person : public QDialog
{
    Q_OBJECT

public:
    explicit Person(QSqlDatabase & sql, QString name_or_nickname, QString surname, QString occupation, QWidget *parent);
    ~Person();

    bool search_in_table();

private:
    Ui::Person *ui;

    QSqlDatabase sql;
    QString name_or_nickname;
    QString surname;
    QString occupation;


};

#endif // PERSON_H

Person.cpp:

#include "person.h"
#include "ui_person.h"


Person::Person(QSqlDatabase & sql, QString name_or_nickname, QString surname, QString occupation, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Person)
{
    ui->setupUi(this);

    this->sql = sql;
    this->name_or_nickname = name_or_nickname;
    this->surname = surname;
    this->occupation = occupation;

}

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

bool Person::search_in_table()
{
    QSqlQuery query(sql);

    int rows = 0;
    QString name = this->name_or_nickname;
    QString _surname = this->surname;
    QString _occupation = this->occupation;

    QString execute = "SELECT COUNT(name) FROM table1 WHERE name_or_nickname='?' AND surname='?' AND occupation='?';";
    query.prepare(execute);
    query.bindValue(0, name);
    query.bindValue(1, _surname);
    query.bindValue(2, _occupation);
    query.exec();

    if (query.next()) 
    {
        rows= query.value(0).toInt();
        return true;
    } 
    else 
    {
        qDebug() << query.lastError();
        return false;
    }
}

main.cpp:

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

Ответы [ 4 ]

0 голосов
/ 16 января 2019

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

Однако, у меня сработала самая простая версия:

QString execute = "SELECT COUNT (*) ИЗ таблицы1 ГДЕ (name_or_nickname = '" + name + "') И (фамилия = '" + фамилия + "') И (занятие = '" + занятие + "') ; ";

Спасибо за вашу помощь.

0 голосов
/ 13 января 2019

Попробуйте этот код:

QSqlDatabase _sql;                                                 
QSqlQuery _query(_sql);
QString execute_stat = "SELECT COUNT(name) FROM table1 WHERE surname='%1' AND 
occupation='%2';";

_query.prepare(execute_stat.arg(surname, occupation));
q.exec();
int rows= 0;
if (q.next()) {
    rows= q.value(0).toInt();
}
0 голосов
/ 13 января 2019

Лучше использовать запрос с параметрами, чтобы предотвратить различные проблемы преобразования типов в SQL

QString execute = "SELECT COUNT(name) FROM table1 WHERE surname=? AND occupation=?;";
QSqlQuery query;
query.prepare(execute);
query.bindValue(0, surname);
query.bindValue(1, occupation);
query.exec();
if (query.next()) {
    rows= query.value(0).toInt();
} else {
    qDebug() << query.lastError(); //check your error here
}
0 голосов
/ 13 января 2019

Вы забыли поставить двойные кавычки в конце утверждения

Ваш:

QString execute = "SELECT COUNT(name) FROM table1 WHERE surname='%1' AND occupation='%2';

Должно быть:

QString execute = "SELECT COUNT(name) FROM table1 WHERE surname='%1' AND occupation='%2';"
...