我试图显示查询结果。首先,如果与服务器的连接正常,则必须显示“已连接”,否则应显示“未连接”。它显示“已连接”。之后,我试图显示最后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;
}
答案 0 :(得分:2)
查看您的代码,似乎有一些您无法完全理解的问题,其中最重要的问题将回答您的问题。
作为一种查询语言,SQL并不是完全标准化的,各种数据库引擎之间的方言略有不同。
虽然几乎所有数据库引擎都了解最常用的条款,例如SELECT
,INSERT
,DELETE
,UPDATE
,WHERE
和ORDER 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();
}
我手边写的所以我不能告诉你这是否有效,但我只想表现出观念。概念是堆不堆栈到函数