Qt - 选择顶部的结果

时间:2015-05-23 09:57:25

标签: c++ mysql qt

我试图显示查询结果。首先,如果与服务器的连接正常,则必须显示“已连接”,否则应显示“未连接”。它显示“已连接”。之后,我试图显示最后3个名字,但它显示“无法选择”。

    #include <QCoreApplication>
    #include <QApplication>
    #include <QtSql/QSql>
    #include<QtSql/QSqlDatabase>
    #include <QtSql/QSqlDriver>
    #include<QtSql/QSqlQuery>
    #include<QDebug>
    #include<QtSql/QSqlError>
    #include<QSqlDatabase>
    #include<QSqlTableModel>
    bool createConnection(), createConnection_second();
    int main(int argc, char *argv[])
    {
        QApplication app (argc,argv);
        if (!createConnection() ){
            qDebug()<<"not connected";
            return 1;
        }
        else
        {
        qDebug()<<"connected";
        QSqlQuery qry;

        qry.exec("SELECT TOP 3 name FROM student");
        while (qry.next()){
            QString name = qry.value(0).toString();
            qDebug()<<"name:"<<name;
        }
        if(!qry.exec())
            qDebug()<<"cannot select";
        else
            qDebug()<<"select";
        return 0;
 }

        return app.exec();
    }
    bool createConnection(){
        QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("localhost");
        db.setUserName("root");
        db.setDatabaseName("connection_qt");
        db.setPassword("");
        if (!db.open()){
            qDebug()<<"Database error occured";
            return false;
        }
        return true;
    }

2 个答案:

答案 0 :(得分:2)

查看您的代码,似乎有一些您无法完全理解的问题,其中最重要的问题将回答您的问题。

作为一种查询语言,SQL并不是完全标准化的,各种数据库引擎之间的方言略有不同。

虽然几乎所有数据库引擎都了解最常用的条款,例如SELECTINSERTDELETEUPDATEWHEREORDER BY ,有些数据库引擎不了解不经常使用的子句。

这是您遗憾地发现的问题,您正在尝试使用TOP子句获取查询的子集。

TOP子句不是普遍理解的,这是T-SQL方言的一部分,由Access或SQL Server中的Microsoft数据库引擎使用。

不幸的是,MySQL和Oracle数据库使用不同的子句来实现相同的功能:MySQL的LIMIT子句和Oracle的ROWNUM

LIMIT子句必须放在SQL语句的最末端,并且可以有一个或两个参数。它的语法是:

LIMIT [offset,] rowcount

由于您在问题中使用的是MySQL数据库引擎,因此需要将SQL查询修改为以下内容:

SELECT name FROM student LIMIT 3

(如果你没有输入offset值,则假设偏移为0)

我在您的代码中注意到了第二个问题。它不是您的问题的原因,但它可能在将来成为一个问题,因为您似乎想要打开两个连接。

如果您使用以下声明:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

您正在创建新的数据库连接,而您正在访问默认的数据库连接。

如果要以相同的方式在程序中的其他位置打开新连接,您将重置默认连接并将其替换为新的连接详细信息。

为了能够同时打开多个连接,您需要为不同的连接指定唯一的名称。

QSqlDatabase db1 = QSqlDatabase::addDatabase("QMYSQL", "connection1");
QSqlDatabase db2 = QSqlDatabase::addDatabase("QMYSQL", "connection2");

请注意,函数调用之间的连接仍然存在,您可以使用

访问已创建(和打开)的连接
QSqlDatabase db = QSqlDatabase::database("connection1");

但如果您已完成连接,请记得关闭连接并将其从全局连接列表中删除:

QSqlDatabase db = QSqlDatabase::database("connection1");
db.close();
QSqlDatabase::removeDatabase("connection1");
db = QSqlDatabase::database("connection2");
db.close();
QSqlDatabase::removeDatabase("connection2");

但请注意,在删除连接之前必须关闭连接,否则会导致资源泄漏。

查看documentation以获取有关如何使用这些功能的更多详细说明。

编辑:

我忘了添加,如果使用命名连接,则必须将数据库对象传递给QSqlQuery对象,以便将查询与该特定命名连接相关联,否则,查询将尝试使用默认数据库连接。

QSqlDatabase db = QSqlDatabase::database("connection1");
QSqlQuery query(db);

答案 1 :(得分:-2)

也许这就是为什么因为你的对象 QSqlDatabase db 是在函数堆栈上创建的,所以当函数结束时对象 db消失。尝试将此对象创建为外部指针...

主要功能

中的

main()
{

QSqlDatabase *db = new  QSqlDatabase();
// your setings db

     QApplication app (argc,argv);

        QSqlQuery qry;
        qry.exec("SELECT TOP 3 name FROM student");
        while (qry.next()){
            QString name = qry.value(0).toString();
            qDebug()<<"name:"<<name;
        }

     app.exec();

}

我手边写的所以我不能告诉你这是否有效,但我只想表现出观念。概念是堆不堆栈到函数