#pragma once #include #include #include "sqldatetime.h" class CSqlVariant { public: enum Type { Invalid = 0, Bool, Char, UChar, Short, UShort, Int, UInt, LongLong, ULongLong, Float, Double, Date, Time, DateTime, String, ByteArray }; public: CSqlVariant(); CSqlVariant(Type type); CSqlVariant(char v); CSqlVariant(bool v); CSqlVariant(int v); CSqlVariant(unsigned int v); CSqlVariant(long long v); CSqlVariant(unsigned long long v); CSqlVariant(float v); CSqlVariant(double v); CSqlVariant(short v); CSqlVariant(unsigned short v); CSqlVariant(unsigned char v); CSqlVariant(const CSqlDate &v); CSqlVariant(const CSqlTime &v); CSqlVariant(const CSqlDateTime &v); CSqlVariant(const char *v); CSqlVariant(const char* v,unsigned int len,bool bIsByteArray); CSqlVariant(const std::string &v ,bool bIsByteArray= false); CSqlVariant(const CSqlVariant &O); CSqlVariant &operator=(const CSqlVariant &o); ~CSqlVariant(); bool operator==(const CSqlVariant &o) const; bool operator!=(const CSqlVariant &o) const; template T ToValue() const { T v; ToValue(v); return v; } int ToValue(int &v)const; unsigned int ToValue(unsigned int &v) const; long long ToValue(long long &v) const; unsigned long long ToValue(unsigned long long &v) const; bool ToValue(bool &v)const; float ToValue(float &v) const; double ToValue(double &v)const; std::string & ToValue(std::string &v) const; char ToValue(char &v) const; unsigned char ToValue(unsigned char &v) const; short ToValue(short &v)const; unsigned short ToValue(unsigned short &v) const; CSqlDate & ToValue(CSqlDate &v)const; CSqlTime & ToValue(CSqlTime &v)const; CSqlDateTime & ToValue(CSqlDateTime &v)const; const void *GetData()const; unsigned int GetDataLen()const; void* GetBuffer(); int GetBufferLen()const; void SetDataLen(int nlen); void SetBufferLen(int nlen); void ReleaseBuffer(); void SetType(Type type); Type GetType()const; const char*GetTypeName()const; bool CanConvertTo(Type t)const; bool IsNull()const; void SetNull(bool bNull); private: void CopyFrom(const CSqlVariant &o); void InitBuffer(unsigned int len); void InitData(const char*v,unsigned int len); void FreeBuffer(); union { bool b; char c; unsigned char uc; short s; unsigned short us; int i; unsigned int ui; //also store the time,date long long ll; unsigned long long ull; //also store the datetime float f; double d; int *p; //format :[ref_count][buf_len][data_len][data][....] ,这个内存数据可以共享使用。线程不安全 // p[0] p[1] p[2] [p3] } m_data; Type m_type; unsigned int m_is_null; }; #define VARINTARR std::vector