From 57fecb7a30d37a7fe899c17ed92073e09a27e243 Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Mon, 31 Mar 2025 16:01:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A1=A8=E5=B1=9E=E6=80=A7=E5=8E=9F=E5=A7=8B=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/attributeTableModel.h | 9 +++++++ include/global.h | 18 ++++++++++++++ include/sqlQueryExecutor.h | 3 ++- source/attributeTableModel.cpp | 45 ++++++++++++++++++++++++++++------ source/sqlQueryExecutor.cpp | 29 ++++++++++++++++++++++ 5 files changed, 95 insertions(+), 9 deletions(-) diff --git a/include/attributeTableModel.h b/include/attributeTableModel.h index b9dd999..65525e0 100644 --- a/include/attributeTableModel.h +++ b/include/attributeTableModel.h @@ -87,7 +87,15 @@ private: EditState state = Clean; }; + struct DataType //数据类型 + { + int id; + QString type; + QString db; //为哪个数据库的可用类型 + }; + void iniDisplayField(); + void getDataTypes(); void loadPageData(); // 加载当前页数据 void updateTotalCount(); // 更新总记录数 @@ -99,6 +107,7 @@ private: QList m_displayField; QList m_currentPageData; QHash m_modifiedRows; //key:global row number + QMap m_dataTypes; }; #endif //ATTRIBUTETABLEMODEL_H diff --git a/include/global.h b/include/global.h index 74222f6..a6bfbd9 100644 --- a/include/global.h +++ b/include/global.h @@ -72,6 +72,24 @@ struct Model }; +struct Attribute +{ + int id; + QString name; //中文展示名称(filed:attribute_name) + QString type; //英文表示名称(filed:attribute),不可重名 + int dataTypeID; + int dataLength; //filed:length_precision + QString defaultValue; + + Attribute(int id, QString name, QString type, int dataTypeID, int dataLength, QString defaultVaule) + :id(id), + name(std::move(name)), + type(std::move(type)), + dataTypeID(dataTypeID), + dataLength(dataLength), + defaultValue(std::move(defaultVaule)){} +}; + struct ModelAttributeGroup { int modelID; diff --git a/include/sqlQueryExecutor.h b/include/sqlQueryExecutor.h index 20d2030..20aa873 100644 --- a/include/sqlQueryExecutor.h +++ b/include/sqlQueryExecutor.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include "global.h" class SqlQueryExecutor : public QObject @@ -21,6 +21,7 @@ public: */ QSqlQuery executeBatchSQL(const QString& strConnectionName, const QStringList& sqlStatements, const QList& paramsList = QList(), bool useTranscation = false); + QHash getFiledType(const QString& strConnectionName, const QString& table, const QString& schema = "basic"); //基于具体业务的查询接口-对外调用 const QVector getModels(const QString&); const QVector getAttributeGroup(const QString&); diff --git a/source/attributeTableModel.cpp b/source/attributeTableModel.cpp index d2ad424..01c3612 100644 --- a/source/attributeTableModel.cpp +++ b/source/attributeTableModel.cpp @@ -12,6 +12,7 @@ AttributeTableModel::AttributeTableModel(const ModelAttributeGroup& modelAttribu m_paginationInfo.currentPage = 1; m_paginationInfo.totalEntries = 0; + getDataTypes(); iniDisplayField(); } @@ -158,32 +159,60 @@ void AttributeTableModel::iniDisplayField() FieldInfo field1; field1.originalName = "attribute"; field1.displayName = QString::fromWCharArray(L"属性类别"); - field1.dataType = "character varying(128)"; + //field1.dataType = "character varying(128)"; m_displayField.append(field1); FieldInfo field2; field2.originalName = "attribute_name"; field2.displayName = QString::fromWCharArray(L"属性名称"); - field2.dataType = "character varying(64)"; + //field2.dataType = "character varying(64)"; m_displayField.append(field2); FieldInfo field3; field3.originalName = "data_type_id"; field3.displayName = QString::fromWCharArray(L"数据类型"); - field3.dataType = "bigint"; + //field3.dataType = "bigint"; m_displayField.append(field3); FieldInfo field4; field4.originalName = "length_precision"; - field4.displayName = QString::fromWCharArray(L"数据精度"); - field4.dataType = "integer"; + field4.displayName = QString::fromWCharArray(L"数据长度"); + //field4.dataType = "integer"; m_displayField.append(field4); FieldInfo field5; field5.originalName = "default_value"; field5.displayName = QString::fromWCharArray(L"默认值"); - field5.dataType = "character varying(64)"; + //field5.dataType = "character varying(64)"; m_displayField.append(field5); + + QHash fieldType = SqlQueryExecutor::instance().getFiledType(m_connection, "attribute", "basic"); + for(int i = 0; i < m_displayField.count(); i++) + { + QString strFiled = m_displayField.at(i).originalName; + m_displayField[i].dataType = fieldType.value(strFiled); + } +} + +void AttributeTableModel::getDataTypes() +{ + QString strSQL = "SELECT * FROM basic.data_type ORDER BY id ASC"; + try + { + QSqlQuery query = SqlQueryExecutor::instance().executeSQL(m_connection, strSQL); + while(query.next()) + { + DataType dataType; + dataType.id = query.value(0).toInt(); + dataType.type = query.value(1).toString(); + dataType.db = query.value(2).toString(); + m_dataTypes.insert(dataType.id, dataType); + } + } + catch (const DatabaseException& e) + { + LOG_ERROR("SQL", QString::fromWCharArray(L"获取数据类型失败")); + } } void AttributeTableModel::loadPageData() @@ -358,14 +387,14 @@ void AttributeTableModel::removeRecord(int row) int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage + row; - /*if(m_currentPageData.at(row).state == New) //新添加未提交的记录,直接删除 + if(m_currentPageData.at(row).state == New) //新添加未提交的记录,直接删除 { beginRemoveRows(QModelIndex(), row, row); m_modifiedRows.remove(globalRow); m_currentPageData.removeAt(row); endRemoveRows(); } - else*/ //整行画红线进行标记 + else //整行画红线进行标记 { m_currentPageData[row].state = Deleted; m_modifiedRows[globalRow] = m_currentPageData[row]; diff --git a/source/sqlQueryExecutor.cpp b/source/sqlQueryExecutor.cpp index 9a1325b..ce88e68 100644 --- a/source/sqlQueryExecutor.cpp +++ b/source/sqlQueryExecutor.cpp @@ -156,6 +156,35 @@ QSqlQuery SqlQueryExecutor::executeBatchSQL(const QString& strConnectionName, co return lastQuery; } +//获取表的字段类型信息(目前只针对PostgerSQL) +QHash SqlQueryExecutor::getFiledType(const QString& strConnectionName, const QString& table, const QString& schema) +{ + QHash fieldTypes; + QString strSQL = QString( + "SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod) " + "FROM pg_catalog.pg_attribute a " + "JOIN pg_catalog.pg_class c ON a.attrelid = c.oid " + "JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid " + "WHERE c.relname = LOWER(:table_name) " + "AND n.nspname = LOWER(:schema_name) " + "AND a.attnum > 0 AND NOT a.attisdropped;" + ); + QVariantHash params; + params.insert(":table_name", table); + params.insert(":schema_name", schema); + try + { + QSqlQuery query = executeSQL(strConnectionName, strSQL, params); + while(query.next()) + fieldTypes.insert(query.value(0).toString(), query.value(1).toString()); + } + catch (const DatabaseException& e) + { + LOG_ERROR("SQL", QString::fromWCharArray(L"获取属性原始数据类型失败")); + } + + return fieldTypes; +} //具体业务查询接口 const QVector SqlQueryExecutor::getModels(const QString& strConnectionName)