QT使用占位符操作sql语句时,执行exec后会报错“Parameter count mismatch“的原因
void BaseSql::insertSim(const QMap<QString, QVariant> ¶ms, 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);
}
}