From 25249b97b64e9cb71875eb8e92db1cf463413df6 Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Wed, 2 Apr 2025 14:58:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B1=9E=E6=80=A7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/sqlQueryExecutor.h | 1 + source/attributeTableModel.cpp | 36 ++++++++++++++-- source/sqlQueryExecutor.cpp | 75 +++++++++++++++++++++++++++++++--- 3 files changed, 103 insertions(+), 9 deletions(-) diff --git a/include/sqlQueryExecutor.h b/include/sqlQueryExecutor.h index 579671c..abdfb28 100644 --- a/include/sqlQueryExecutor.h +++ b/include/sqlQueryExecutor.h @@ -37,6 +37,7 @@ public: bool getAtrributeInfo(const QString&, const QString&, Attribute&); bool batchInsertAttributes(const QString&, int, int, QList); bool batchDeleteAttributes(const QString&, int, int, QList); + bool batchUpdateAttributes(const QString&, int, int, QList); signals: void errorOccurred(const QString& error); diff --git a/source/attributeTableModel.cpp b/source/attributeTableModel.cpp index 9e1430a..084cc98 100644 --- a/source/attributeTableModel.cpp +++ b/source/attributeTableModel.cpp @@ -113,6 +113,7 @@ bool AttributeTableModel::setData(const QModelIndex &index, const QVariant &valu m_currentPageData[row] = modifiedRow; emit dataChanged(index, index, {role, Qt::UserRole + 100}); + emit syncDataStatus(m_modifiedRows.isEmpty(), m_paginationInfo); return true; } @@ -432,8 +433,10 @@ void AttributeTableModel::submitChanges() bool insertCompleted = false; QList deleteRows = filterRowsByEditState(Deleted); bool deleteCompleted = false; - // QList updateRows = filterRowsByEditState(Modified); + QList updateRows = filterRowsByEditState(Modified); + bool updateCompleted = false; + //插入操作 if(!insertRows.isEmpty()) { QList insertAttributes; @@ -451,11 +454,12 @@ void AttributeTableModel::submitChanges() QString defaultValue = "null"; if(rowData.values.value(4).isValid()) defaultValue = rowData.values.value(4).toString(); + insertAttributes.emplace_back(-1, name, type, dataTypeID, dataLength, defaultValue); } insertCompleted = SqlQueryExecutor::instance().batchInsertAttributes(m_connection, m_modelAttributeGroup.modelID, m_modelAttributeGroup.groupID, insertAttributes); } - + //删除操作 if(!deleteRows.isEmpty()) { QList deleteAttributes; @@ -468,8 +472,34 @@ void AttributeTableModel::submitChanges() } deleteCompleted = SqlQueryExecutor::instance().batchDeleteAttributes(m_connection, m_modelAttributeGroup.modelID, m_modelAttributeGroup.groupID, deleteAttributes); } + //更新操作 + if(!updateRows.isEmpty()) + { + QList updateAttributes; + for(const RowData& rowData : updateRows) + { + if(rowData.values.count() != m_displayField.count() + 1) //loadPageData时,会把属性id放到valuse的最后,并且不做展示 + continue; - if( (!insertRows.isEmpty() && !insertCompleted) && (!deleteRows.isEmpty() && !deleteCompleted) ) + int id = rowData.values.last().toInt(); + QString type = rowData.values.value(0).toString(); + QString name = rowData.values.value(1).toString(); + int dataTypeID = rowData.values.value(2).toInt(); + int dataLength = -1; + if(rowData.values.value(3).isValid()) + dataLength = rowData.values.value(3).toInt(); + QString defaultValue = "null"; + if(rowData.values.value(4).isValid()) + defaultValue = rowData.values.value(4).toString(); + + updateAttributes.emplace_back(id, name, type, dataTypeID, dataLength, defaultValue); + } + updateCompleted = SqlQueryExecutor::instance().batchUpdateAttributes(m_connection, m_modelAttributeGroup.modelID, m_modelAttributeGroup.groupID, updateAttributes); + } + + if( (!insertRows.isEmpty() && !insertCompleted) + && (!deleteRows.isEmpty() && !deleteCompleted) + && (!updateRows.isEmpty() && !updateCompleted) ) { emit showMessage(type_warning, QString::fromWCharArray(L"错误"), QString::fromWCharArray(L"数据提交失败,详情可查看日志文件")); } diff --git a/source/sqlQueryExecutor.cpp b/source/sqlQueryExecutor.cpp index 9e23cfb..d5f1d37 100644 --- a/source/sqlQueryExecutor.cpp +++ b/source/sqlQueryExecutor.cpp @@ -466,18 +466,18 @@ bool SqlQueryExecutor::batchInsertAttributes(const QString& connectionName, int //先插入进属性表attribute,因为要获取插入后的自增id,所以采用逐条插入的方法 QList attributeIDList; - for(const Attribute& atrribute : attributes) + for(const Attribute& attribute : attributes) { qint64 attributeID = QDateTime::currentDateTime().toMSecsSinceEpoch(); //先向model_type中插入一条记录 QString strSQL = "INSERT INTO basic.attribute (attribute, attribute_name, data_type_id, length_precision, default_value) VALUES " "(:type, :name, :dataType, :dataLength, :defaultValue)"; QVariantHash params; - params.insert(":type", atrribute.type); - params.insert(":name", atrribute.name); - params.insert(":dataType", atrribute.dataTypeID); - params.insert(":dataLength", atrribute.dataLength); - params.insert(":defaultValue", atrribute.defaultValue); + params.insert(":type", attribute.type); + params.insert(":name", attribute.name); + params.insert(":dataType", attribute.dataTypeID); + params.insert(":dataLength", attribute.dataLength); + params.insert(":defaultValue", attribute.defaultValue); try { QSqlQuery query = executeSQL(connectionName, strSQL, params); @@ -592,3 +592,66 @@ bool SqlQueryExecutor::batchDeleteAttributes(const QString& connectionName, int return true; } + +bool SqlQueryExecutor::batchUpdateAttributes(const QString& connectionName, int modelID, int attributeGroupID, QList attributes) +{ + //属于批量操作,需要开启事务 + QSqlDatabase db = QSqlDatabase::database(connectionName); + if(!db.isOpen()) + { + LOG_ERROR("DB", QString("Database not open. connectionName: %1").arg(connectionName)); + return false; + } + + if(!db.transaction()) + { + LOG_ERROR("DB", QString("Start transaction failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + return false; + } + + QSqlQuery query(db); + QString strSQL = "UPDATE basic.attribute SET attribute = ?, attribute_name = ?, data_type_id = ?, length_precision = ?, default_value = ? WHERE id = ?"; + if(!query.prepare(strSQL)) + { + LOG_ERROR("SQL", QString("SQL '%1' prepare fialed. error: %2").arg(strSQL, query.lastError().databaseText())); + if(!db.rollback()) // 回滚 + { + LOG_ERROR("DB", QString("Rollback failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + } + return false; + } + QVariantList types, names, dataTypes, lengths, defaults, ids; + for(const Attribute& attribute : attributes) + { + types << attribute.type; + names << attribute.name; + dataTypes << attribute.dataTypeID; + lengths << attribute.dataLength; + defaults << attribute.defaultValue; + ids << attribute.id; + } + query.addBindValue(types); + query.addBindValue(names); + query.addBindValue(dataTypes); + query.addBindValue(lengths); + query.addBindValue(defaults); + query.addBindValue(ids); + if( !query.execBatch() ) + { + LOG_ERROR("SQL", QString("SQL '%1' execBatch error: %2").arg(strSQL, query.lastError().databaseText())); + LOG_INFO("DB", QString("DB Rollback")); + if(!db.rollback()) // 回滚 + { + LOG_ERROR("DB", QString("Rollback failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + } + return false; + } + + if(!db.commit()) // 提交 + { + LOG_ERROR("DB", QString("Commit transaction failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + return false; + } + + return true; +}