COMPASSi/trunk/code/inc/Util/include/DataSet.h

126 lines
7.5 KiB
C
Raw Normal View History

2025-06-25 15:06:42 +08:00
#ifndef _DATASET_
#define _DATASET_
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlTableModel>
#include <QtSql/QSqlQuery>
#include <QString>
#include "ConnectionPool.h"
#include "UtilityGlobal.h"
//#include "DataTable.h"
#include "Util.h"
class DataTable;
class DataSet;
/* 定义:DataSet 的表的集合
DataSet的所有DataTable对象,tablename作为索引index索引.net提供index索引
DataSet与DataTableCollection是组合关系
DataTableCollection使用AddRemoveClear
Contains确定由索引或名称指定的特定表是否位于集合中
Count获取元素中集合总数 */
class UTILITY_API DataTableCollection
{
friend class DataSet;
using DataTableManager = QMap<QString, DataTable*>;
//typedef typename QMap<QString, DataTable*> DataTableManager;
public:
/* .net的DataSet皆需通过DataTableCollection实现以下方法。eg:ds.Tables.Remove(ds.Tables("Srh11_Print"))
C++ DataSet类直接在DataSet类提供以下方法eg:ds.Remove(ds.Tables("Srh11_Print")) DataTableCollection以下方法该为private
便public使DataSet或DataTableCollection的方法 */
void Add(DataTable* p_data_table); //将指定的 DataTable 添加到集合。 ds.Tables().Add(dt)
DataTable& operator[](const QString& table_name); //根据table名获取table。 ds.Tables()["Capacity_tab"].Select("CompartmentID=" & compid, "capacity")
DataTable* getTabelByName(const QString& table_name);
bool Remove(const QString& table_name); //从集合中删除具有指定名称的 DataTable 对象。
bool Remove(DataTable* p_data_table); //从集合中移除指定的 DataTable 对象。
bool Contains(const QString& table_name); //检测table是否存在。 If ds.Tables.Contains(scp.Name) Then
int Count(); //获取集合中的元素总数。
/* .NET 中 clear public 提供,这里沿袭这个做法,但是这个函数极度危险,不要乱用 */
void Clear(); //清除所有 DataTable 对象的集合。
void print_tablename(); //打印包含的表名
DataTableManager& get_map(); //保留接口便于开发人员直接对map操作
private:
DataTableCollection() {};
DataTableCollection(DataSet* initialized_dataset); //DataTableCollection不可脱离于DataSet独立存在
DataTableCollection(const DataTableCollection& other); //可删除。DataTableCollection不可脱离于DataSet独立存在构造必须有dataset
DataTableCollection(const DataTableCollection& other, DataSet* initialized_dataset);
DataTableCollection& operator=(const DataTableCollection& other);
~DataTableCollection();
void _dscollect_to_db(); //将包含所有datatable数据全转移到_table_model里并提交到db
private:
DataTableManager _table_manager; //表示 DataSet 的表的集合.
DataSet* _data_set = nullptr; //所属DataSet
};
/* 定义:数据集
DataTableCollection
DataTableCollection管理DataTable
DataSet与DataTableCollection是组合关系
DataSet
DataSet建立数据库连接
DataSet的数据库连接和名字是唯一的 */
class UTILITY_API DataSet
{
friend class DataTable;
friend class DataTableCollection;
public:
DataSet();
DataSet(const QString& dataset_dir, const QString& connect_name); //根据数据库文件名创建dataset,dataset_dir=":memory:"时创建内存数据库
DataSet(const QString& dataset_name); //根据名称创建创建dataset
DataSet(const DataSet& other); //_db,_dataset_name无需拷贝。仅拷贝DataTableCollection
DataSet& operator=(const DataSet& other); //同上 拷贝时只拷贝table数据。连接/所属dataset皆置为默认值。用户可在拷贝后自行设置
~DataSet();
void AddTable(DataTable& t);
void AddTable(DataTable* t); //外部增加的值 不论是new 的还是局部对象 自行管理,该函数都会复制一份内部自己管理,外部的内存外部自行管理
DataTable copyTableByName(QString strTableName);
void removeTableByName(QString strTableName);
public:
void Add(DataTable* p_data_table); //将指定的 DataTable 添加到dataset。 ds.Add(dt) ,并传递db(若dataset已连接)
DataTable& operator[](const QString& table_name); //获取指定name的table对象
DataTable* getTableByName(const QString& table_name);
bool Remove(const QString& table_name); //从集合中删除具有指定名称的 DataTable 对象。
bool Remove(DataTable* p_data_table); //从集合中移除指定的 DataTable 对象。
bool Contains(const QString& table_name); //检测table是否存在。 If ds.Tables.Contains(scp.Name) Then
int Count(); //获取集合中的元素总数。
void Clear(); //清除所有 DataTable 对象。
DataTableCollection& Tables(); //获取包含在 DataSet 中的表的集合。
public:
void connect(const QString &db_name,const QString &connectionName = QString()); //连接数据库并未同步ds的数据若需同步数据则需在table进行操作
void disconnect(); //连接数据库并未同步ds的数据若需同步数据则需在table进行操作
bool has_db() { return _db.isValid(); } //是否连接数据库
QSqlDatabase& get_db(); //获取dataset的db连接
void set_db(QSqlDatabase& db); //设置dataset的db连接
void set_name(const QString& name); //设置_dataset_name
QString get_name(); //获取_dataset_name
void print_tablename(); //打印dataset包含的表名
//待补充 void dd_to_ds(); ds_to_db();
void ds_to_db(); //将ds所有表保存到db
private:
void _init();
void _destroy();
private:
QString _dataset_name; //DataSet名称
QSqlDatabase _db; //拷贝构造和赋值时无需拷贝该值
DataTableCollection* _tables = nullptr;
};
#endif