Как сохранить или обновить несколько таблиц одновременно в C ++ в базе данных sqlite? - PullRequest
0 голосов
/ 12 марта 2020
       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 и более запросов, это займет много времени и не будет идеальным.

1 Ответ

0 голосов
/ 12 марта 2020

Если вы создали все запросы с заполнителями и все они имеют одинаковые параметры в одинаковом порядке:

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(?,?,?,?,?,?)");

Вы можете l oop над ними следующим образом:

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() (если! Успех)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...