1、在资源文件中添加模块
QT += sql
2、包含头文件
#include <QSqlDatabase>
#include <QSqlQuery> // 查询
#include <QSqlError> // 错误信息
#include <QSqlRecord> // 记录
#include <QDebug>
3、查看支持的数据库驱动
foreach (QString str, QSqlDatabase::drivers())
{
qDebug() << str;
}
4、使用驱动程序类型和连接名称将数据库添加到数据库连接列表中。
//只能通过ODBC连接SQLServer和Access数据库
//不创建QSqlDatabase变量,通过连接名称访问数据库
//QSqlDatabase::addDatabase("QODBC"); // 可通过QSqlDatabase::database()访问数据库
//QSqlDatabase::addDatabase("QODBC", "connId"); // 可通过QSqlDatabase::database("connId")访问数据库
// 设置数据库名字,DRIVER={}中的内容要和数据源管理器(区分x32和x64)中的驱动名字一样
// 不必设置用户和密码,设置了也没用。通过setUserName和setPassword设置
//myDatabase.setDatabaseName("DRIVER={SQL Native Client};SERVER=(local);DATABASE=tt"); // SQLServer
myDatabase.setDatabaseName("Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\wsh\\WshChl.mdb"); // Access
// 设置数据库名字,使用数据源管理器中配置的DSN
//myDatabase.setDatabaseName("mysqlserver");
myDatabase.setUserName("sa"); // 设置用户
myDatabase.setPassword("sa"); // 设置密码
5、打开数据库
if (!myDatabase.open()) // 打开数据库
{
// 打开失败,提示错误信息
QMessageBox::warning(nullptr, "错误", myDatabase.lastError().text());
}
6、创建查询对象
QSqlQuery myQuery(myDatabase); // 创建到数据库的查询对象
QString sqlStr;
// 使用占位符指定参数,?或者:参数名
// 使用?时,bindValue只能使用序号,使用:时,bindValue可以使用序号和参数名
sqlStr = "select "
"format(RiQi, 'yyyy-m-d') as 日期, "
"round(avg(field13), 2) as 平均值 "
"from wsh "
"where RiQi >= :StartDate and RiQi <= :EndDate " // 使用占位符
"group by format(riQi, 'yyyy-m-d') "
"order by cdate(format(RiQi, 'yyyy-m-d'))"; // 如果不转换,对于1位数的日期排序不正确,或使用2位数日期
myQuery.prepare(sqlStr);
// 指定占位符参数
myQuery.bindValue(":StartDate", "2024-01-01"); // 或者(0, "2024-01-10")
myQuery.bindValue(":EndDate", "2024-01-10"); // 或者(1, "2024-12-20")
7、执行查询
if (!myQuery.exec())
{
// 查询失败,提示错误信息
QMessageBox::warning(nullptr, "错误", myQuery.lastError().text());
}
8、输出查询结果
qDebug() << myQuery.record().count(); // 输出查询结果的字段数量
// next()检索结果中的下一条记录,并将查询定位在检索到的记录上
// 如果当前定位在最后一条记录,执行next()返回false
while (myQuery.next())
{
qDebug() << "第" << myQuery.at() << "记录:"; // 当前记录位置。第1条位于0位。第1条之前为-1,最后1条之后为-2
// 通过字段索引输出值。按照select中的顺序,第一个字段为value(0)
// 不建议使用 SELECT *,因为查询中字段的顺序未定义
qDebug().noquote().nospace() << myQuery.value(0).toString() << " @ " << myQuery.value(1).toReal(); // 没有引号和空格
//通过字段名称输出值
//qDebug().noquote().nospace() << myQuery.value("日期").toString() << " @ " << myQuery.value("平均值").toReal();
}