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

126 lines
7.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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使用Add、Remove、Clear 等方法来管理集合中的项。
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