void SQLManager::runQuery(const QString &text, const QString &connection) { kDebug() << "connection:" << connection; kDebug() << "text:" << text; if (text.isEmpty()) return; if (!isValidAndOpen(connection)) return; QSqlDatabase db = QSqlDatabase::database(connection); QSqlQuery query(db); if (!query.prepare(text)) { QSqlError err = query.lastError(); if (err.type() == QSqlError::ConnectionError) m_model->setStatus(connection, Connection::OFFLINE); emit error(err.text()); return; } if (!query.exec()) { QSqlError err = query.lastError(); if (err.type() == QSqlError::ConnectionError) m_model->setStatus(connection, Connection::OFFLINE); emit error(err.text()); return; } QString message; /// TODO: improve messages if (query.isSelect()) { if (!query.driver()->hasFeature(QSqlDriver::QuerySize)) message = i18nc("@info/plain", "Query completed successfully"); else { int nRowsSelected = query.size(); message = i18ncp("@info/plain", "%1 record selected", "%1 records selected", nRowsSelected); } } else { int nRowsAffected = query.numRowsAffected(); message = i18ncp("@info/plain", "%1 row affected", "%1 rows affected", nRowsAffected); } emit success(message); emit queryActivated(query, connection); }
void tableTemplateWidget::deleteTemplate(void) { if (templateId == 0) return; QMessageBox delTmp(QMessageBox::Question, tr("Deleting template!"), tr("Do you want delete template ?"), QMessageBox::Yes | QMessageBox::No); int code = delTmp.exec(); if (code == QMessageBox::No) return; QSqlQuery query; QSqlError le; query.prepare("DELETE FROM crossword.private_data WHERE _template = ?;"); query.addBindValue(QVariant(templateId)); query.exec(); le = query.lastError(); if (le.type() != QSqlError::NoError) qDebug() << "1. deleteTemplate: " << le.text(); query.prepare("DELETE FROM crossword.grids WHERE _template = ?;"); query.addBindValue(QVariant(templateId)); query.exec(); le = query.lastError(); if (le.type() != QSqlError::NoError) qDebug() << "2. deleteTemplate: " << le.text(); query.prepare("DELETE FROM crossword.templates WHERE _id = ?;"); query.addBindValue(QVariant(templateId)); query.exec(); le = query.lastError(); if (le.type() != QSqlError::NoError) qDebug() << "3. deleteTemplate: " << le.text(); for (int i = 0; i < numCol; i++) removeColumn(0); setRowCount(0); sb->showMessage(tr("Template deleted"), 2000); // need for templateListWidget emit deletedFromDB(templateId); numCol = numRow = 0; templateId = 0; countWords = 0; wi.clear(); }
QString MythDB::DBErrorMessage(const QSqlError& err) { if (!err.type()) return "No error type from QSqlError? Strange..."; return QString("Driver error was [%1/%2]:\n" "%3\n" "Database error was:\n" "%4\n") .arg(err.type()) .arg(err.number()) .arg(err.driverText()) .arg(err.databaseText()); }
void plumaje::insertColor () { if (!nombrePluma->text().isEmpty() && !descripcionPluma->text().isEmpty()) { if (modificando) { QString consulta = "UPDATE plumaje SET nombre = \"" + nombrePluma->text() + "\", \ descripcion = \"" + descripcionPluma->text() + "\" \ WHERE plumajeID = " + tablaPlumaje->currentRecord()->value(0).toString(); qWarning (consulta); QSqlQuery queryUpdate (consulta, QSqlDatabase::database("palomar" )); QSqlError error = queryUpdate.lastError(); if (error.type() != QSqlError::None) KMessageBox::error (this, i18n("Error actualizando el color de pluma. El error devuelto por la base de datos es:\n") + error.databaseText(), i18n ("Error actualizando color de pluma")); else { tablaPlumaje->refresh(); InsertButton->setText(i18n("Insertar")); modificando = FALSE; descripcionPluma->clear(); nombrePluma->clear(); } } else { QString consulta = "INSERT INTO plumaje (nombre, descripcion) VALUES ('"; consulta += nombrePluma->text() + "', '" + descripcionPluma->text() + "');"; qWarning (consulta); QSqlQuery queryInsert (consulta, QSqlDatabase::database("palomar" )); QSqlError error = queryInsert.lastError(); if (error.type() != QSqlError::None) KMessageBox::error (this, i18n("Error insertantdo el color de pluma.El error devuelto por la base de datos es:\n") + error.databaseText(), i18n ("Error añadiendo el color de pluma")); else { tablaPlumaje->refresh(); descripcionPluma->clear(); nombrePluma->clear(); } } } else KMessageBox::error (this, i18n("Debe rellenar el nombre y la descripción."), i18n ("Error añadiendo tipo de suelta")); }
void ConnDlg::on_okButton_clicked() { if (ui.comboDriver->currentText().isEmpty()) { ui.status_label->setText(tr("请选择一个数据库驱动!")); ui.comboDriver->setFocus(); } else if(ui.comboDriver->currentText() =="QSQLITE") { addSqliteConnection(); //创建数据库表,如已存在则无须执行 creatDB(); accept(); } else { QSqlError err = addConnection(driverName(), databaseName(), hostName(),userName(), password(), port()); if (err.type() != QSqlError::NoError) ui.status_label->setText(err.text()); else ui.status_label->setText(tr("连接数据库成功!")); //创建数据库表,如已存在则无须执行 accept(); } }
/*! * \brief SqlQuery::exec Execute a existing query with capability to throw SqlException * if necessary. * \return true if successfully executed, false otherwise. */ bool SqlQuery::exec() throw(SqlException) { bool b = m_sqlQuery.exec(); QSqlError sqlError = m_sqlQuery.lastError(); switch(sqlError.type ()) { case QSqlError::NoError: return b; case QSqlError::ConnectionError: case QSqlError::StatementError: if(sqlError.databaseText() == "MySQL server has gone away"){ throw SqlConnectionException(sqlError); }else{ throw SqlStatementException(sqlError); } case QSqlError::TransactionError: throw SqlTransactionException(sqlError); case QSqlError::UnknownError: throw SqlUnknownException(sqlError); default: throw SqlException(sqlError); } }
bool DatabaseLogger::logqmsg(MSqlQuery &query, LoggingItem *item) { char timestamp[TIMESTAMP_MAX]; char *threadName = getThreadName(item); strftime( timestamp, TIMESTAMP_MAX-8, "%Y-%m-%d %H:%M:%S", (const struct tm *)&item->tm ); query.bindValue(":THREAD", threadName); query.bindValue(":MSGTIME", timestamp); query.bindValue(":LEVEL", item->level); query.bindValue(":MESSAGE", item->message); if (!query.exec()) { // Suppress Driver not loaded errors that occur at startup. // and suppress additional errors for one second after the // previous error (to avoid spamming the log). QSqlError err = query.lastError(); if ((err.type() != 1 || err.number() != -1) && (!m_errorLoggingTime.isValid() || (m_errorLoggingTime.elapsed() > 1000))) { MythDB::DBError("DBLogging", query); m_errorLoggingTime.start(); } return false; } deleteItem(item); return true; }
bool SvDeviceEditor::loadKTSs() { QSqlQuery* q = new QSqlQuery(SQLITE->db); QSqlError serr = SQLITE->execSQL(QString(SQL_SELECT_KTSS_LIST), q); if(QSqlError::NoError != serr.type()) { _last_error = serr.text(); delete q; return false; } while(q->next()) ui->cbDeviceType->addItem(q->value("kts_name").toString(), q->value("kts_id").toUInt()); q->finish(); delete q; if(ui->cbDeviceType->count()) ui->cbDeviceType->setCurrentIndex(0); ui->bnSave->setEnabled(!ui->cbDeviceType->currentData().isNull()); connect(ui->cbDeviceType, SIGNAL(currentIndexChanged(int)), this, SLOT(updateKTSInfo(int))); return true; }
void MainWindow::updateCurrencies() { QList<Currency> list; market->getCurrenciesList(list); QSqlError err = db_helper->updateCurrenciesTable(list); if (err.type() != QSqlError::NoError) { showError(err); return; } }
void checkDatabaseError(const QSqlDatabase &db) { QSqlError lastError = db.lastError(); if (lastError.type() != QSqlError::NoError) { #if QT_VERSION >= 0x050300 throw Exception { lastError.nativeErrorCode().toInt(), lastError.text().toStdString() }; #else throw Exception { lastError.number(), lastError.text().toStdString() }; #endif } }
TestMarketData::TestMarketData(QObject *parent) : QObject(parent), db_helper(NULL), market(NULL) { db_helper = new DBHelper(":memory:"); QSqlError err = db_helper->initDb(); if (err.type() != QSqlError::NoError) { qDebug() << "Error: " << err; } market = new CryptocoinChartsMDP(); }
void plumaje::eliminarColor() { QString consulta = "DELETE FROM plumaje WHERE plumajeID = " + tablaPlumaje->currentRecord()->value(0).toString(); QSqlQuery queryDelete (consulta, QSqlDatabase::database("palomar" )); QSqlError error = queryDelete.lastError(); if (error.type() != QSqlError::None) KMessageBox::error (this, i18n("Error eliminando el color de pluma. El error devuelto por la base de datos es:\n") + error.databaseText(), i18n ("Error eliminando el color de pluma")); tablaPlumaje->refresh(); }
bool SqlUtils::isLockError(const QSqlError& error) { if (error.type() == QSqlError::StatementError && ( error.text().contains(QLatin1String("(55P03)")) || //the actual error code, not translated. needs patched QPSQL driver error.text().contains(QLatin1String("could not obtain lock")) ) ) { return true; } return false; }
void ojo::eliminarTipo() { QString consulta = "DELETE FROM ojo WHERE ojoID = " + tablaOjos->currentRecord()->value(0).toString(); QSqlQuery queryDelete (consulta, QSqlDatabase::database("palomar" )); QSqlError error = queryDelete.lastError(); if (error.type() != QSqlError::None) KMessageBox::error (this, i18n("Error eliminando el tipo de ojo. El error devuelto por la base de datos es:\n") + error.databaseText(), i18n ("Error eliminando el tipo de ojo")); tablaOjos->refresh(); }
SQLconnector::SQLconnector() { if (!QSqlDatabase::drivers().contains("QSQLITE")); // initialize the database QSqlError err = this->initDb(); if (err.type() != QSqlError::NoError) { showError(err); return; } }
void SvSerialEditor::accept() { params.name = ui->cbPortName->currentData().toString(); params.description = ui->cbPortName->currentText(); params.baudrate = ui->cbBaudrate->currentData().toUInt(); params.databits = QSerialPort::DataBits(ui->cbDataBits->currentData().toInt()); params.flowcontrol = QSerialPort::FlowControl(ui->cbFlowControl->currentData().toInt()); params.parity = QSerialPort::Parity(ui->cbParity->currentData().toInt()); params.stopbits = QSerialPort::StopBits(ui->cbStopBits->currentData().toInt()); try { QSqlError err = check_params_exists(params.dev_type); if(QSqlError::NoError != err.type()) _exception.raise(err.databaseText()); err = SQLITE->execSQL(QString(SQL_UPDATE_DEVICES_SERIAL_PARAMS_WHERE) .arg(params.name) .arg(params.baudrate) .arg(params.parity) .arg(params.stopbits) .arg(params.databits) .arg(params.flowcontrol) .arg(params.description) .arg(params.dev_type)); if(QSqlError::NoError != err.type()) _exception.raise(err.databaseText()); QDialog::accept(); } catch(SvException e) { _last_error = e.err; // qDebug() << _last_error; QDialog::reject(); } }
QVariantMap ScriptQuery::lastError() { QVariantMap m; QSqlError err = _query.lastError(); m.insert("databaseText", err.databaseText()); m.insert("driverText", err.driverText()); m.insert("text", err.text()); m.insert("number", err.number()); m.insert("type", err.type()); m.insert("isValid", QVariant(err.isValid(), 0)); return m; }
void addConnectionsFromCommandline(const QStringList &args, Browser *browser) { for (int i = 1; i < args.count(); ++i) { QUrl url(args.at(i), QUrl::TolerantMode); if (!url.isValid()) { qWarning("Invalid URL: %s", qPrintable(args.at(i))); continue; } QSqlError err = browser->addConnection(url.scheme(), url.path().mid(1), url.host(), url.userName(), url.password(), url.port(-1)); if (err.type() != QSqlError::NoError) qDebug() << "Unable to open connection:" << err; } }
void OrganizerCalendarDatabaseAccess::sqliteErrorMapper(const QSqlError &sqlError, int& errorCode) { switch (sqlError.type()) { case QSqlError::NoError: errorCode = CALENDAR_OPERATION_SUCCESSFUL; break; case QSqlError::ConnectionError: case QSqlError::StatementError: case QSqlError::TransactionError: case QSqlError::UnknownError: default : errorCode = CALENDAR_DATABASE_ERROR; break; } }
void TestMarketData::TestUpdateCurrencies() { QList<Currency> list; market->getCurrenciesList(list); QVERIFY( list.size() > 100 ); QSqlError err = db_helper->updateCurrenciesTable(list); if (err.type() != QSqlError::NoError) { qDebug() << "Error: " << err; QFAIL ( err.text().toStdString().c_str() ); } QSqlQuery q; q.exec("select count(*) from currencies"); if(!q.next()) QFAIL("currencies table is empty in TestUpdateCurrencies"); int count = q.value(0).toInt(); QCOMPARE(list.size(), count); }
QVariantMap XSqlQueryProto::lastError() { QVariantMap m; XSqlQuery *item = qscriptvalue_cast<XSqlQuery*>(thisObject()); if (item) { QSqlError err = item->lastError(); m.insert("databaseText", err.databaseText()); m.insert("driverText", err.driverText()); m.insert("text", err.text()); m.insert("number", err.number()); m.insert("type", err.type()); m.insert("isValid", QVariant(err.isValid())); } return m; }
/// \brief Actually insert a log message from the queue into the database /// \param query The database insert query to use /// \param item LoggingItem containing the log message to insert bool DatabaseLogger::logqmsg(MSqlQuery &query, LoggingItem *item) { char timestamp[TIMESTAMP_MAX]; time_t epoch = item->epoch(); struct tm tm; localtime_r(&epoch, &tm); strftime(timestamp, TIMESTAMP_MAX-8, "%Y-%m-%d %H:%M:%S", (const struct tm *)&tm); query.bindValue(":TID", item->tid()); query.bindValue(":THREAD", item->threadName()); query.bindValue(":FILENAME", item->file()); query.bindValue(":LINE", item->line()); query.bindValue(":FUNCTION", item->function()); query.bindValue(":MSGTIME", timestamp); query.bindValue(":LEVEL", item->level()); query.bindValue(":MESSAGE", item->message()); query.bindValue(":APP", item->appName()); query.bindValue(":PID", item->pid()); if (!query.exec()) { // Suppress Driver not loaded errors that occur at startup. // and suppress additional errors for one second after the // previous error (to avoid spamming the log). QSqlError err = query.lastError(); if ((err.type() != 1 || err.number() != -1) && (!m_errorLoggingTime.isValid() || (m_errorLoggingTime.elapsed() > 1000))) { MythDB::DBError("DBLogging", query); m_errorLoggingTime.start(); } return false; } return true; }
void ActivityWizard::setVisible(bool visible) { if (visible) { DBManager manager; QSqlError error; if (mRecord.contains("id") && mRecord.value("id").toULongLong() != 0) { mActivity = manager.getActivity(mRecord.value("id").toULongLong(), error); if (error.type() != QSqlError::NoError) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText( tr("There was an error while loading activity from the " "database.")); msgBox.setDetailedText(error.text()); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); reject(); return; } if (!mActivity) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The requested activity does not exist.")); msgBox.setInformativeText(tr("Maybe someone or system clean up " "job deleted the activity. " "Try refreshing the data.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); reject(); return; } } else { mActivity = make_shared<Activity>(); } } QWizard::setVisible(visible); }
/* * Створюємо новий пустий шаблон кросворду */ void tableTemplateWidget::createNew(void) { QDialog *dialog = new QDialog(); sizeOfTemplate = new Ui::SizeOfTemplate(); sizeOfTemplate->setupUi(dialog); dialog->setModal(true); dialog->exec(); if (dialog->result() == QDialog::Accepted) { numRow = sizeOfTemplate->spinRows->value(); numCol = sizeOfTemplate->spinColumns->value(); QSqlQuery query; query.prepare("INSERT INTO crossword.templates (_rows, _columns) VALUES (?, ?);"); query.addBindValue(QVariant(numRow)); query.addBindValue(QVariant(numCol)); query.exec(); QSqlError le = query.lastError(); if (le.type() == QSqlError::NoError) templateId = query.lastInsertId().toInt(); else qDebug() << "createNew: " << le.text(); wi.clear(); setRowCount(numRow); setColumnCount(numCol); for (int i = 0; i < numRow; i++) for (int j = 0; j < numCol; j++) newCell(i, j, 0); isDirty = true; } delete dialog; }
void Browser::addConnection() { QSqlConnectionDialog dialog(this); if (dialog.exec() != QDialog::Accepted) return; if (dialog.useInMemoryDatabase()) { QSqlDatabase::database("in_mem_db", false).close(); QSqlDatabase::removeDatabase("in_mem_db"); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "in_mem_db"); db.setDatabaseName(":memory:"); if (!db.open()) QMessageBox::warning(this, tr("Unable to open database"), tr("An error occurred while " "opening the connection: ") + db.lastError().text()); QSqlQuery q("", db); q.exec("drop table Movies"); q.exec("drop table Names"); q.exec("create table Movies (id integer primary key, Title varchar, Director varchar, Rating number)"); q.exec("insert into Movies values (0, 'Metropolis', 'Fritz Lang', '8.4')"); q.exec("insert into Movies values (1, 'Nosferatu, eine Symphonie des Grauens', 'F.W. Murnau', '8.1')"); q.exec("insert into Movies values (2, 'Bis ans Ende der Welt', 'Wim Wenders', '6.5')"); q.exec("insert into Movies values (3, 'Hardware', 'Richard Stanley', '5.2')"); q.exec("insert into Movies values (4, 'Mitchell', 'Andrew V. McLaglen', '2.1')"); q.exec("create table Names (id integer primary key, Firstname varchar, Lastname varchar, City varchar)"); q.exec("insert into Names values (0, 'Sala', 'Palmer', 'Morristown')"); q.exec("insert into Names values (1, 'Christopher', 'Walker', 'Morristown')"); q.exec("insert into Names values (2, 'Donald', 'Duck', 'Andeby')"); q.exec("insert into Names values (3, 'Buck', 'Rogers', 'Paris')"); q.exec("insert into Names values (4, 'Sherlock', 'Holmes', 'London')"); connectionWidget->refresh(); } else { QSqlError err = addConnection(dialog.driverName(), dialog.databaseName(), dialog.hostName(), dialog.userName(), dialog.password(), dialog.port()); if (err.type() != QSqlError::NoError) QMessageBox::warning(this, tr("Unable to open database"), tr("An error occurred while " "opening the connection: ") + err.text()); } }
ProvidersDialog::ProvidersDialog(QWidget *parent, LkSettingsManager *settings, QSqlDatabase *db) : QDialog(parent), ui(new Ui::ProvidersDialog) { ui->setupUi(this); m_settings = settings; connect(ui->checkBox, SIGNAL(toggled(bool)), m_settings, SLOT(setShowAllProvs(bool))); m_model = new LkSqlTableModel(this, *db); m_model->setTable("Providers"); m_model->setFilter("is_deleted = 0"); QSqlError er = m_model->lastError(); if(er.type() != QSqlError::NoError) { QMessageBox::critical(this, tr("Ошибка открытия таблицы"), tr("Ошибка %1\n%2").arg( QString::number(er.type()), er.text()), QMessageBox::Close); } connect(this, SIGNAL(accepted()), m_model, SLOT(submitAll())); initModel(); }
QSqlError DetaDoc::connectToDb() { db = QSqlDatabase::addDatabase("QMYSQL3"); db.setDatabaseName(dbName); db.setHostName(dbHost); db.setPort(dbPort); db.setUserName(dbUser); db.setPassword(dbPass); QSqlError err; if(!db.open()) { err = db.lastError(); db = QSqlDatabase(); } if(err.type() != QSqlError::NoError) { QMessageBox::warning(this, tr("Unable to open database"), err.text()); } return err; }
SvDeviceEditor::SvDeviceEditor(QWidget *parent, int deviceId) : QDialog(parent), ui(new Ui::SvDeviceDialog) { ui->setupUi(this); showMode = deviceId == -1 ? smNew : smEdit; if(!loadKTSs()) QMessageBox::critical(this, "Error", _last_error, QMessageBox::Ok); loadPorts(); if(showMode == smEdit) { QSqlQuery* q = new QSqlQuery(SQLITE->db); QSqlError serr = SQLITE->execSQL(QString(SQL_SELECT_ONE_DEVICE).arg(deviceId), q); if(QSqlError::NoError != serr.type()) { delete q; _last_error = serr.text(); QDialog::done(Error); return; } q->first(); _id = q->value("device_id").toInt(); _device_name = q->value("device_name").toString(); _device_kts_id = q->value("device_kts_id").toInt(); _device_ifc_name = q->value("device_ifc_name").toString(); _device_protocol_name = q->value("device_protocol_name").toString(); _device_connection_params = q->value("connection_params").toString(); _device_data_type_name = q->value("device_data_type_name").toString(); _device_data_length = q->value("device_data_length").toString(); _device_driver_path = q->value("device_driver_lib_path").toString(); _device_description = q->value("device_description").toString(); q->finish(); delete q; ui->cbDeviceType->setCurrentIndex(ui->cbDeviceType->findData(_device_kts_id)); } if(showMode == smNew) this->setWindowTitle("Новое устройство"); else this->setWindowTitle(QString("Устройство: %1").arg(_device_name)); if(showMode == smNew) ui->editID->setText("<Новый>"); else ui->editID->setText(QString::number(_id)); ui->editDeviceName->setText(_device_name); // ui->cbDevicePortName->setCurrentIndex(ui->cbDevicePortName->findText(_device_port_name)); ui->editDeviceIfc->setText(_device_ifc_name); ui->editDeviceProtocol->setText(_device_protocol_name); ui->editDeviceDataType->setText(_device_data_type_name); ui->editDeviceDataLength->setText(_device_data_length); ui->editDeviceDriverPath->setText(_device_driver_path); ui->textDeviceDescription->setText(_device_description); connect(ui->bnSave, &QPushButton::clicked, this, &QDialog::accept); connect(ui->bnCancel, &QPushButton::clicked, this, &QDialog::reject); connect(ui->bnNewDeviceType, &QPushButton::clicked, this, &SvDeviceEditor::newKTS); connect(ui->bnEditDeviceType, &QPushButton::clicked, this, &SvDeviceEditor::editKTS); // connect(ui->bnConfig, SIGNAL(clicked()), this, SLOT(config())); this->setModal(true); this->show(); }
void SvDeviceEditor::accept() { try { /* делаем всякие проверки вводимых данных */ if(ui->editDeviceName->text() == "") { QMessageBox::critical(0, "Ошибка", "Имя устройства не указано"); ui->editDeviceName->setFocus(); return; } if(ui->cbDevicePortName->currentText().isEmpty() | (ui->cbDevicePortName->currentIndex() == -1)) { QMessageBox::critical(0, "Ошибка", "Необходимо указать порт"); ui->cbDevicePortName->setFocus(); return; } // /* конец проверок */ _device_name = ui->editDeviceName->text(); _device_kts_id = ui->cbDeviceType->currentData().toInt(); // _device_connection_params = ui->cbDevicePortName->currentText(); _device_description = ui->textDeviceDescription->toPlainText(); switch (this->showMode) { case smNew: { QSqlError serr = SQLITE->execSQL(QString(SQL_NEW_DEVICE) .arg(_device_name) .arg(_device_kts_id) .arg(_device_connection_params) .arg(_device_description)); if(QSqlError::NoError != serr.type()) _exception.raise(serr.text()); break; } case smEdit: { QSqlError serr = SQLITE->execSQL(QString(SQL_UPDATE_DEVICE) .arg(_device_name) .arg(_device_kts_id) .arg(_device_connection_params) .arg(_device_description) .arg(_id)); if(QSqlError::NoError != serr.type()) _exception.raise(serr.text()); break; } } QDialog::done(Accepted); } catch(SvException& e) { _last_error = e.error; QDialog::done(Error); } }
void dbError(const QSqlError & dbe) { QMessageBox::critical(this, tr("Cannot open database"), tr("Error") + ":\n" + castError(dbe.type()) + "\n\n" + dbe.text(), QMessageBox::Ok); }