QT使用占位符操作sql语句时,执行exec后会报错“Parameter count mismatch“的原因

时间:2025-03-01 14:43:25
void BaseSql::insertSim(const QMap<QString, QVariant> &params, const QString &tableName) { db_sim.transaction(); QSqlQuery query(databaseMap.value(SIM_MODE)); QString keys; foreach (QString key, params.keys()) { keys.append(key).append(","); } keys.chop(1); qDebug() << "keys = " << keys;//这里的顺序不是params插入的原始顺序,是经过排序之后的顺序 if(tableName == TmoGroupContactTable || tableName == DmoGroupContactTable) { if(getSimdealNumber()==1) { //首次处理 m_sql += QString("insert into %1 (%2) select ").arg(tableName).arg(keys); m_sql += QString("%1, '%2', '%3', %4, %5, '%6' ").arg(params["id"].toInt()).arg(params["name"].toString()).arg(params["num"].toString())\ .arg(params["numType"].toInt()).arg(params["airAddr"].toInt()).arg(params["pinyin"].toString()); } else { m_sql += QString("union all select "); m_sql += QString("%1, '%2', '%3', %4, %5, '%6' ").arg(params["id"].toInt()).arg(params["name"].toString()).arg(params["num"].toString())\ .arg(params["numType"].toInt()).arg(params["airAddr"].toInt()).arg(params["pinyin"].toString()); } } else if(tableName == subgroupTableName) { if(getSimdealNumber()==1) { //首次处理 m_sql += QString("insert into %1 (%2) select ").arg(tableName).arg(keys); m_sql += QString("%1, %2, ?, '%3', %4 ").arg(params["id"].toInt()).arg(params["memNum"].toInt()).arg(params["name"].toString())\ .arg(params["type"].toInt()); bytearraylist.append(params["member"].toByteArray()); } else { m_sql += QString("union all select "); m_sql += QString("%1, %2, ?, '%3', %4 ").arg(params["id"].toInt()).arg(params["memNum"].toInt()).arg(params["name"].toString())\ .arg(params["type"].toInt()); bytearraylist.append(params["member"].toByteArray()); } } else if(tableName == subgroupListTableName) { if(getSimdealNumber()==1) { //首次处理 m_sql += QString("insert into %1 (%2) select ").arg(tableName).arg(keys); m_sql += QString("%1, %2 ").arg(params["id"].toInt()).arg(params["subgroupId"].toInt()); } else { m_sql += QString("union all select "); m_sql += QString("%1, %2 ").arg(params["id"].toInt()).arg(params["subgroupId"].toInt()); } } if(getSimdealNumber()==getSimhandleNumber()) { //sql语句注入完毕 m_sql.chop(1); m_sql.append(";"); Log(m_sql); if(tableName == subgroupTableName) { query.prepare(m_sql); foreach(QByteArray byteArray, bytearraylist) { query.addBindValue(byteArray); } exec(query,m_sql); } db_sim.commit(); m_sql = ""; setSimhandleNumber(0); setSimdealNumber(0); } }