首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在sqlite数据库中的c++中同时保存或更新多个表?

如何在sqlite数据库中的c++中同时保存或更新多个表?
EN

Stack Overflow用户
提问于 2020-03-12 08:01:02
回答 1查看 143关注 0票数 0
代码语言:javascript
复制
       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());
       }

我想知道一种简单的方法来更新sqlite中的表。因为这种方法还会弹出3次信息提示,如果我有10次以上的查询,会很费时,也不太理想。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-12 08:29:10

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

代码语言:javascript
复制
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(?,?,?,?,?,?)");

您可以按以下方式对它们进行循环:

代码语言:javascript
复制
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");
}

可能的改进:

  • 切换到*命名占位符,并将所有占位符存储在QMap<QString, QVariant>中。
  • 把所有的东西都包装在一个交易中。这使您能够避免部分更新。(使用QSqlDatabase().transaction()启动事务并调用QSqlDatabase().commit() (如果成功)或QSqlDatabase().rollback() (如果成功)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60649800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档