252 lines
7.3 KiB
C++
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;
|
|
};
|