#pragma once #ifndef __UIIVALUETABLE_H__ #include "UIIValueTable.h" #endif #include "comutil.h" #include #include #include struct sqlite3; class TGADOSRV_API SQLTable { public: enum FieldType { // SQLite Expert 根本上支持以下几种类型 // 其它类型会归至到以下几种基本类型 // 具体参见 sqlite expert 帮助文档 Data types 部分 eNULL = 0, // 空 eInt, // 整型 eLargeint, // 大整型 eFloat, // 浮点型 eWideString, // 字符串 eCurrency, // 货币 eBlob, // Blob数据 eWideMemo, // WideMemo eDate, // Date eTime, // Time eDateTime, // DateTime eBoolean, // BOOL eGraphic, // Graphic }; struct SQLCell { public: SQLCell() : m_iRow(-1), m_iCol(-1), m_data(_T("")), m_Name(_T("")), m_type(eNULL){} SQLCell(int iRow, int iCol, LPCTSTR pszData, FieldType type, LPCTSTR pszName) : m_iRow(iRow), m_iCol(iCol), m_data(pszData), m_Name(pszName), m_type(type){} int m_iRow, m_iCol; // 第几行,第几列 FieldType m_type; // 类型 CString m_Name; // 字段 CString m_data; // 数据 struct CmpByRow { bool operator () (const SQLCell *p1, const SQLCell *p2) const { return p1->m_iRow < p2->m_iRow; } }; struct CmpByCol { bool operator () (const SQLCell *p1, const SQLCell *p2) const { return p1->m_iCol < p2->m_iCol; } }; void ToData(int &i) const { i = m_data.IsEmpty() ? 0 : ToInteger(); } void ToData(__int64 &i) const { i = m_data.IsEmpty() ? 0 : ToLargeInteger(); } void ToData(double &d) const { d = m_data.IsEmpty() ? .0 : ToReal(); } void ToData(bool &b) const { b = m_data.IsEmpty() ? false : ToBoolean(); } void ToData(CString &s) const { if (m_data.IsEmpty()) s = _T(""); else s = ToString(); } operator int() const { return m_data.IsEmpty() ? 0 : ToInteger(); } operator __int64() const { return m_data.IsEmpty() ? 0 : ToLargeInteger(); } operator double () const { return m_data.IsEmpty() ? .0 : ToReal(); } operator bool () const { return m_data.IsEmpty() ? false : ToBoolean(); } operator CString () const { if (m_data.IsEmpty()) return _T(""); else return m_data; } private: CString ToString() const { return m_data; } __int64 ToLargeInteger() const { return _ttoi64(m_data); } int ToInteger() const { return _ttoi(m_data); } bool ToBoolean() const { return ToInteger() == 0 ? false : true; } double ToReal() const { USES_CONVERSION; return atof(W2A(m_data)); } }; typedef const SQLCell* SQLCellPtr; typedef std::vector SQLCellPtrs; public: SQLTable(LPCTSTR pszDatabase) : m_pDb(NULL), m_QueryOfFields(0), m_Rows(0), m_Columns(0), m_Cells(0), m_nRows(0), m_nCols(0){ InitSqlite(pszDatabase); } ~SQLTable(); public: bool Valid() { return m_pDb != NULL; } bool QuerySQL(LPCTSTR pszSql, LPCTSTR pszTblName); int CountOfRow(){ return m_nRows; } int CountOfCol(){ return m_nCols; } const SQLCellPtrs* GetRow(const int &nRow){ if (nRow >= m_nRows) return NULL; return &m_Rows[nRow]; } const SQLCellPtrs* GetCol(const int &nCol){ if (nCol >= m_nCols) return NULL; return &m_Columns[nCol]; } const std::vector* GetAllOfRow(){ return &m_Rows; } const std::vector* GetAllOfCol(){ return &m_Columns; } SQLCellPtr GetCell(const int &nRow, const int &nCol){ if (nRow >= m_nRows || nCol >= m_nCols) return NULL; return m_Rows[nRow][nCol]; } bool AttachDB(LPCTSTR pszDB); void ReleaseDB(); protected: sqlite3 *m_pDb; std::map m_AllOfFields; // 所有的字段信息 SQLCellPtrs m_QueryOfFields; // 查询结果中的字段信息 是 m_AllOffields的子集 std::vector m_Rows; // 查询结果中的行集合 m_Cells 子集 std::vector m_Columns; // 查询结果中的列集合 m_Cells 子集 SQLCellPtrs m_Cells; // 查询结果集合 int m_nRows, m_nCols; // 查询结果 行数 列数 private: bool InitSqlite(LPCTSTR pszDatabase); bool InitFieldInfo(LPCTSTR pszSql); FieldType ParserFieldType(LPCTSTR psz); void CollectColumns(); void CollectRows(); void FreeMemo(); }; //字段名定义描述 class TGADOSRV_API CUIITableField { public: CUIITableField() { m_sFieldName = ""; m_sFieldType = ""; m_nSize = 0; m_bIsAllowNull = TRUE; m_bPrimaryKey = FALSE; } CUIITableField(const CUIITableField& dataSrc) { m_sFieldName = dataSrc.m_sFieldName; m_sFieldType = dataSrc.m_sFieldType; m_nSize = dataSrc.m_nSize; m_bIsAllowNull = dataSrc.m_bIsAllowNull; m_bPrimaryKey = dataSrc.m_bPrimaryKey; } virtual ~CUIITableField(){} CUIITableField& operator = (const CUIITableField &dataSrc) { m_sFieldName = dataSrc.m_sFieldName; m_sFieldType = dataSrc.m_sFieldType; m_nSize = dataSrc.m_nSize; m_bIsAllowNull = dataSrc.m_bIsAllowNull; m_bPrimaryKey = dataSrc.m_bPrimaryKey; return *this; } public: CString m_sFieldName; CString m_sFieldType; //类型: 字符型 : varchar 文本 : text 字节 : varbinary // ole型 : image 长整型: int 实数型: float // double型: real 短整型: smallint // 时间 : datetime long m_nSize; //长度 BOOL m_bIsAllowNull; //不允许空 BOOL m_bPrimaryKey; //主键 }; typedef CArray Ttable; class TGADOSRV_API CUIISQLiteServer { public: CUIISQLiteServer(void); ~CUIISQLiteServer(void); //初始化 BOOL InitADOServer(LPCTSTR pszDbFileName); // 关闭 void CloseADOServer(); //创建表 BOOL CreateDBTable(LPCTSTR pszTableName,Ttable& arFields); //判断表是否存在 BOOL IsDbTableExist(LPCTSTR pszTableName); //获取表的结构信息 BOOL GetTableStru(LPCTSTR pszTableName,Ttable& arFields,BOOL bTypeAsSQLite = TRUE); //获取表的结构信息 BOOL GetTableStru(LPCTSTR pszTableName,CStringList& listField); //删除数据库中的表 BOOL DeleteTable(LPCTSTR pszTableName); //删除数据库中的若干表 BOOL DeleteTable(CStringArray& arTableNames); //向表中增加若干字段名 BOOL AppendTableFields(LPCTSTR pszTableName,Ttable& arFields); //向表中增加字段 BOOL AppendTableFields(LPCTSTR pszTableName, CUIITableField& arFields); //获得一个数值 int GetSelData(LPCTSTR pszStrSQL,CString& sValue); //把获得相应的信息填到数组中 int GetSelData(LPCTSTR pszStrSQL,CStringArray& arStrValue); int GetSelData(LPCTSTR pszStrSQL,CStringArray& arStrValue,int nFr, int nTo); //nFr,nTo为数组索引号 //是否是空选择集 BOOL IsSelEmpty(LPCTSTR pszStrSQL); //把获得相应的信息填到链表中 int GetSelData(LPCTSTR pszStrSQL,CStringList& listStrValue,BOOL bMakeLower= TRUE); int GetSelData(LPCTSTR pszStrSQL,CStringList& listStrValue, int nFr, int nTo, BOOL bMakeLower= TRUE); //选取多个字段,把获得相应的信息填到'表'对象中 int GetSelData(LPCTSTR pszStrSQL,CUIIValueTable& valueTable,BOOL bUpdateLable = TRUE); int GetSelData(LPCTSTR pszStrSQL,CUIIValueTable& valueTable, int nFr, int nTo, BOOL bUpdateLable = TRUE); //选取两列,一个为Key,一个为Value建map select a,b from...; a-->b int GetSelData(LPCTSTR pszSKey_ValueSQL,CMapStringToString& mapKey_Value); //选取一行,获得Field到对应数据的映射 int GetSelDataEx(LPCTSTR pszSelectSQL,CMapStringToString& mapFieldToValue); int GetSelDataEx(LPCTSTR pszSelectSQL,std::map& mapFieldToValue); //获得数据库中所有的表名 void GetDbTableNameArray(CStringArray& arTables); //获得数据库中所有的表名 void GetDBTableNameList(CStringList& listTables); //执行SQL语句[如 删除,追加,更新] BOOL ExecuteSQL(LPCTSTR pszStrSQL); //判断数据库是否成功打开 BOOL IsDatabaseOpen(); int GetSelData2(LPCTSTR pszStrSQL, CStringArray& arStrValue); protected: sqlite3* m_pSQLiteDb; };