Files
envi-code/SourceCode/Code2026/tg_shs/inc/sqlite/UIISQLiteServer.h
T
2026-09-28 15:28:50 +08:00

252 lines
7.3 KiB
C++

#pragma once
#ifndef __UIIVALUETABLE_H__
#include "UIIValueTable.h"
#endif
#include "comutil.h"
#include <map>
#include <vector>
#include <functional>
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<SQLCellPtr> 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<SQLCellPtrs>* GetAllOfRow(){ return &m_Rows; }
const std::vector<SQLCellPtrs>* 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<CString, FieldType> m_AllOfFields; // 所有的字段信息
SQLCellPtrs m_QueryOfFields; // 查询结果中的字段信息 是 m_AllOffields的子集
std::vector<SQLCellPtrs> m_Rows; // 查询结果中的行集合 m_Cells 子集
std::vector<SQLCellPtrs> 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<CUIITableField,CUIITableField &> 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<CString, CString>& 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;
};