为方便编码,自定义两种类型用于保存单条数据和全部查询结果
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();
}
}