#ifndef _DATASET_ #define _DATASET_ #include #include #include #include #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使用Add、Remove、Clear 等方法来管理集合中的项。 Contains确定由索引或名称指定的特定表是否位于集合中。 Count获取元素中集合总数 */ class UTILITY_API DataTableCollection { friend class DataSet; using DataTableManager = QMap; //typedef typename QMap 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