我正在尝试从 qSQL 数据库中检索数据

Posted

技术标签:

【中文标题】我正在尝试从 qSQL 数据库中检索数据【英文标题】:I'm trying to retrieve data from qSQL database 【发布时间】:2020-05-30 14:40:27 【问题描述】:

但它没有从数据库中获取数据。我不想将数据检索到表中,并且希望在特定的行编辑中显示数据。错误是什么?有没有修改?

这是我正在使用的代码:

void Userdetails::on_pushButton_4_clicked()

    delete ui;

    // database connection
    database = QSqlDatabase::addDatabase("Qmysql");
    database.setHostName("localhost");
    database.setUserName("root");
    database.setPassword("");
    database.setDatabaseName("electricity");

    if(database.open()) 
         QSqlQuery qry;

         QSqlQuery query(QSqlDatabase::database("MyConnect"));

         query.prepare(QString("SELECT accno, fullname, address, telephone FROM user_reg_elec WHERE username = :username AND password = :password"));

         if(query.exec()) 
             query.exec();

             while(query.next()) 
                 ui ->dislayaccountnumber ->setText(query.value(0).toString());
                 ui ->displayname ->setText(query.value(3).toString());
                 ui ->displayaddress ->setText(query.value(4).toString());
                 ui ->displattelephoneno ->setText(query.value(5).toString());
                 // ui ->displayamountoebill ->setText(query.value(6).toString());
             
          else 
               QMessageBox::information(this, "Query did not execute", "Not successful executing the query");
         
     else 
         QMessageBox::information(this, "Database not open", "Not opened successfully");
    

    database.close();

【问题讨论】:

querry.prepare(QString("SELECT accno, fullname, address, telephone FROM user_reg_elec WHERE username = :username AND password = :password")); 您是否添加了参数化查询的值而忘记将该代码添加到您的问题中?我在您的代码中看到了 2 个参数的 bindValue:https://doc.qt.io/qt-5/qsqlquery.html#approaches-to-binding-values @drescherjm 我没有忘记。这就是全部。你能解释一下mutch吗? 链接的文档向您展示了如何操作。 querry.bindValue("::username", "Bart"); 您真的希望用户必须通过用户名和密码进行搜索吗?你会在你的 GUI 中同时问这两个问题吗? 另外我假设只有 1 条记录具有相同的用户名和密码,所以 while(querry.next()) 可能会循环 1 或 0 次。 【参考方案1】:

这段代码有四个主要问题:

    您已删除代码开头的ui。因此,调用ui-> 的第一行将使程序崩溃。 您的查询定义不正确。此外,您选择连接名称的方式也不正确。 您已经执行了两次查询(一次就足够了)。 您尚未绑定 usernamepassword 的值。

请使用以下内容:

void Userdetails::on_pushButton_4_clicked() 

    
        // database connection
        QSqlDatabase database;
        database = QSqlDatabase::addDatabase("QMYSQL","MyConnect");
        database.setHostName("localhost");
        database.setUserName("root");
        database.setPassword("");
        database.setDatabaseName("electricity");

        if(database.open()) 

            QSqlQuery query(database);


            if (query.prepare(QString("SELECT accno, fullname, address, telephone FROM user_reg_elec WHERE username = :username AND password = :password"))) 

                //Add bindings
                query.bindValue(":username","your user name");
                query.bindValue(":password","your password");
                if(query.exec()) 

                    while(query.next()) 
                        ui ->dislayaccountnumber ->setText(query.value(0).toString());
                        ui ->displayname ->setText(query.value(1).toString());
                        ui ->displayaddress ->setText(query.value(2).toString());
                        ui ->displattelephoneno ->setText(query.value(3).toString());
                        // ui ->displayamountoebill ->setText(query.value(4).toString());
                    
                 else 
                    qDebug() << "Query did not execute due to: " << query.lastError().text();
                    QMessageBox::information(this, "Query did not execute", "Not successful executing the query");
                
             else 
                qDebug() << "Query not prepared due to the following error: " << query.lastError().text();
            
         else 
            qDebug() << "Database not opened due to: " << database.lastError().text();
            QMessageBox::information(this, "Database not open", "Not opened successfully");
        

        database.close();
    

    QSqlDatabase::removeDatabase("MyConnect");

如果您尚未包含此库,请在顶部添加#include &lt;QSqlError&gt;

仅限提问者:

要在新窗口中显示详细信息,从数据库中获取目标用户的信息后,可以创建一个新对话框(窗口)并在其中显示结果,如下所示:

    //Create a new dialog
    QDialog *dialog = new QDialog;

    //Add some elements to the dialog
    QLabel *accountNumber = new QLabel("Account number: " + query.value(0).toString());
    QLabel *name = new QLabel("Name: " + query.value(1).toString());
    QLabel *address = new QLabel("Address: " + query.value(2).toString());
    QLabel *phoneNumber = new QLabel("Phone number: " + query.value(3).toString());
    QVBoxLayout *lay = new QVBoxLayout;
    lay->addWidget(accountNumber);
    lay->addWidget(name);
    lay->addWidget(address);
    lay->addWidget(phoneNumber);
    dialog->setLayout(lay);

    //Show the dialog
    dialog->open();

【讨论】:

没有没有。这是一个拼写错误。我忘了删除它。我编辑了我的答案。 如何修改它,使用单独的窗口登录并显示用户详细信息? 您能否详细说明您的问题?让我知道你到底想做什么。 登录后,根据用户名和密码在新窗口显示用户详细信息。 如果我的理解正确,您可以从查询中删除WHERE 条件并选择所有用户名和密码:SELECT accno, fullname, address, telephone FROM user_reg_elec;,然后在您的While 循环中将数据存储在一些数组,然后将它们全部显示在 QTableView 或 QTableWidget 中。

以上是关于我正在尝试从 qSQL 数据库中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

Qt - QSql无法获取行,尝试插入时无查询

我正在尝试使用 ajax 从数据库中检索数据并以引导模式中的形式填充

我正在尝试将 firebase 实时数据库中的数据检索到我的 recyclerview 中,但数据显示为空

尝试使用 Quarkus 从本地 H2 数据库中检索所有行

我正在尝试使用 nodejs 从 mongodb 集合中检索数据,但我必须请求两次才能获得正确的信息

使用 pyodbc 从 SQL 中检索数据