QSqlQuery遍历查询结果

19 篇文章 1 订阅

为方便编码,自定义两种类型用于保存单条数据和全部查询结果

typedef QMap<QString, QVariant> MStr;// 存放查询条件键值对和单条数据
typedef QVector<MStr> VMStr;// 保存查询结果

这是实现代码

/**
 * @brief readRecord 获取数据库数据
 * @param table 表名
 * @param fields 查询字段表达式
 * @param filter 筛选条件
 * @param records 查询结果
 * @return 成功返回true
 */
bool Database::readRecords(const QString &table, const QString &fields, const MStr &filter, VMStr &records)
{
    QString condition = getCondition(filter);
    QString strSql = QString("SELECT %1 FROM `%2` %3").arg(fields).arg(table).arg(condition);
    qDebug() << strSql;
    if (m_db.isOpen())
    {
        QSqlQuery sqlQuery(m_db);
        if (sqlQuery.exec(strSql))
        {
            while (sqlQuery.next())
            {
                MStr record;
                // 遍历一条记录的每一个字段
                for (int i = 0; i < sqlQuery.record().count(); i++)
                {
                    QString fieldName = sqlQuery.record().fieldName(i);
                    QVariant value = sqlQuery.record().value(i);
                    record[fieldName] = value;
                }
                records.append(record);
            }
            return true;
        }
        m_lastError = sqlQuery.lastError().text();
    }
    return false;
}

/**
 * @brief getCondition 组装where子句
 * @param filter 筛选条件
 * @return 返回组装结果
 */
QString Database::getCondition(const MStr &filter)
{
    QString condition = "";
    QStringList fragments;
    for (MStr::const_iterator iter = filter.begin(); iter != filter.end(); iter++)
    {
        QString fragment = QString("`%1` = %2")
                .arg(iter.key())
                .arg(getVariantString(iter.value()));
        fragments.append(fragment);
    }
    if (fragments.size() > 0)
    {
        condition = "WHERE " + fragments.join(" AND ");
    }
    return condition;
}

/**
 * @brief getVariantString 获取未知类型的变量为字符串
 *  如果是字符串则返回用单引号包裹的字符串,整型和浮点数等非字符类型,直接转成字符串
 * @param var 输入变量
 * @return 返回字符串
 */
QString Database::getVariantString(const QVariant &var)
{
    if (var.type() == QVariant::String)
    {
        return QString("\'%1\'").arg(var.toString());
    }
    else
    {
        return var.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值