C++ 如何在c+中一次保存或更新多个表+;在sqlite数据库中?

C++ 如何在c+中一次保存或更新多个表+;在sqlite数据库中?,c++,sqlite,C++,Sqlite,我想知道在sqlite中更新表的一种更简单的方法。因为此方法也会弹出信息提示3次,如果我有10个或更多查询,这将非常耗时且不理想。假设您创建了所有带有占位符的查询,并且它们都具有相同的参数,且顺序相同: QSqlQuery qry4; QSqlQuery qry5; QSqlQuery qry6; qry3.prepare("INSERT INTO apra(Source,Medium,Subject,'Date & Time recei

我想知道在sqlite中更新表的一种更简单的方法。因为此方法也会弹出信息提示3次,如果我有10个或更多查询,这将非常耗时且不理想。

假设您创建了所有带有占位符的查询,并且它们都具有相同的参数,且顺序相同:

       QSqlQuery qry4;
       QSqlQuery qry5;
       QSqlQuery qry6;



 qry3.prepare("INSERT INTO apra(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values('"+src+"','"+med+"','"+key+"','"+one+"','"+one+"','"+res+"')");
       qry4.prepare("INSERT INTO bag(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values('"+src+"','"+med+"','"+key+"','"+one+"','"+one+"','"+res+"')");
       qry5.prepare("INSERT INTO ben(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values('"+src+"','"+med+"','"+key+"','"+one+"','"+one+"','"+res+"')");
       qry6.prepare("INSERT INTO cent(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values('"+src+"','"+med+"','"+key+"','"+one+"','"+one+"','"+res+"')");


 if(qry3.exec()){
           QMessageBox::information(this,"Database","qry3");
       }else{
           QMessageBox::critical(this,tr("error::"),qry3.lastError().text());
       }
       if(qry4.exec()){
           QMessageBox::information(this,"Database","qry4");
       }else{
           QMessageBox::critical(this,tr("error::"),qry4.lastError().text());
       }
       if(qry5.exec()){
           QMessageBox::information(this,"Database","qry5");
       }else{
           QMessageBox::critical(this,tr("error::"),qry5.lastError().text());
       }
       if(qry6.exec()){
           QMessageBox::information(this,"Database","qry6");
       }else{
           QMessageBox::critical(this,tr("error::"),qry6.lastError().text());
       }
您可以按如下方式对其进行循环:

qry3.prepare("INSERT INTO apra(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values(?,?,?,?,?,?)");
qry4.prepare("INSERT INTO bag(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values(?,?,?,?,?,?)");
qry5.prepare("INSERT INTO ben(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values(?,?,?,?,?,?)");
qry6.prepare("INSERT INTO cent(Source,Medium,Subject,'Date & Time received document','Date & Time RRO forwarded to HOO','ControlNo.') values(?,?,?,?,?,?)");
bool success=true;
for(自动&q_包装器:std::初始值设定项_列表{qry3,qry4,qry5,qry6}){
QSqlQuery&q=q_wrapper.get();
q、 addBindValue(src);
q、 附加值(med);
q、 addBindValue(键);
q、 addBindValue(一个);
q、 addBindValue(一个);
q、 附加值(res);
成功&=q.exec();
如果(!成功){
QMessageBox::critical(this,tr(“error::”),q.lastError().text())
打破
}
}
如果(成功){
QMessageBox::信息(此“数据库”、“所有查询成功”);
}
可能的改进:

  • 切换到并将所有占位符存储在
    QMap
  • 在事务中包装所有内容。这使您能够避免部分更新。(使用
    QSqlDatabase().transaction()
    启动事务,然后调用
    QSqlDatabase().commit()
    (如果成功)或
    QSqlDatabase().rollback()
    (如果!成功)

如果所有4个表都有相同的列,那么它们是单独的表还是只有一个表有一个包含枚举的额外列?请阅读并使用prepared语句placeholders@AlanBirtles他们都分开了,先生。是的,但我想说的是,如果他们不分开,你就不会有一个problem@AlanBirtles哦,我明白了,有solu吗那么我的问题是什么?对不起,我刚刚开始。我在代码中收到了这个错误::错误:在'std::reference\u wrapper'中没有名为'addBindValue'的成员我应该创建一个公共线程吗?如果是,我怎么做?对不起,这是最后一分钟的更改。你需要在引用包装器上调用
.get()
。更新了我的答案。
bool success = true;
for (auto& q_wrapper : std::initializer_list<std::reference_wrapper<QSqlQuery>>{qry3, qry4, qry5, qry6}) {
  QSqlQuery& q = q_wrapper.get();
  q.addBindValue(src);
  q.addBindValue(med);
  q.addBindValue(key);
  q.addBindValue(one);
  q.addBindValue(one);
  q.addBindValue(res);
  success &&= q.exec();
  if (!success) {
    QMessageBox::critical(this,tr("error::"),q.lastError().text())
    break;
  }
}

if (success) {
  QMessageBox::information(this,"Database","all queries succeeded");
}