一个“关于COleVariant类型转换“的类

时间:2022-04-10 18:35:58
我们在打开一个记录集,然后用GetFieldValue返回一个COleVariant类型的值,如何把这个值转换成CString型的值,或float型的值等? 

下面这个类可以完成转换工作.

可能不少的人知道这个类,我现在还是贴出来。

6 个解决方案

#1


strVARIANT

///crack.h
class CCrack 

public: 
static LPCTSTR strFieldType(short sType); 
static LPCTSTR strQueryDefType(short sType); 
static LPCTSTR strBOOL(BOOL bFlag); 
static CString strVARIANT(const COleVariant& var); 
}; 

///crack.cpp
#include "stdafx.h" 
#include "crack.h" 

LPCTSTR CCrack::strFieldType(short sType) 

switch(sType){ 
case (dbBoolean): 
return _T("Bool"); 
case (dbByte): 
return _T("Byte"); 
case (dbInteger): 
return _T("Integer"); 
case (dbLong): 
return _T("Long"); 
case (dbCurrency): 
return _T("Currency"); 
case (dbSingle): 
return _T("Single"); 
case (dbDouble): 
return _T("Double"); 
case (dbDate): 
return _T("Date"); 
case (dbText): 
return _T("Text"); 
case (dbLongBinary): 
return _T("Long Binary"); 
case (dbMemo): 
return _T("Memo"); 
case (dbGUID): 
return _T("GUID"); 

return _T("Unknown"); 


LPCTSTR CCrack::strQueryDefType(short sType) 

switch(sType){ 
case (dbQSelect): 
return _T("Select"); 
case (dbQAction): 
return _T("Action"); 
case (dbQCrosstab): 
return _T("Crosstab"); 
case (dbQDelete): 
return _T("Delete"); 
case (dbQUpdate): 
return _T("Update"); 
case (dbQAppend): 
return _T("Append"); 
case (dbQMakeTable): 
return _T("MakeTable"); 
case (dbQDDL): 
return _T("DDL"); 
case (dbQSQLPassThrough): 
return _T("SQLPassThrough"); 
case (dbQSetOperation): 
return _T("Set Operation"); 
case (dbQSPTBulk): 
return _T("SPTBulk"); 

return _T("Unknown"); 
}

#2


LPCTSTR CCrack::strBOOL(BOOL bFlag) 

return bFlag ? _T("TRUE") : _T("FALSE"); 


CString CCrack::strVARIANT(const COleVariant& var) 

CString strRet; 
strRet = _T("Fish"); 
switch(var.vt){ 
case VT_EMPTY: 
case VT_NULL: 
strRet = _T("NULL"); 
break; 
case VT_I2: 
strRet.Format(_T("%hd"),V_I2(&var)); 
break; 
case VT_I4: 
strRet.Format(_T("%d"),V_I4(&var)); 
break; 
case VT_R4: 
strRet.Format(_T("%e"),(double)V_R4(&var)); 
break; 
case VT_R8: 
strRet.Format(_T("%e"),V_R8(&var)); 
break; 
case VT_CY: 
strRet = COleCurrency(var).Format(); 
break; 
case VT_DATE: 
strRet = COleDateTime(var).Format(_T("%m %d %y")); 
break; 
case VT_BSTR: 
strRet = V_BSTRT(&var); 
break; 
case VT_DISPATCH: 
strRet = _T("VT_DISPATCH"); 
break; 
case VT_ERROR: 
strRet = _T("VT_ERROR"); 
break; 
case VT_BOOL: 
return strBOOL(V_BOOL(&var)); 
case VT_VARIANT: 
strRet = _T("VT_VARIANT"); 
break; 
case VT_UNKNOWN: 
strRet = _T("VT_UNKNOWN"); 
break; 
case VT_I1: 
strRet = _T("VT_I1"); 
break; 
case VT_UI1: 
strRet.Format(_T("0x%02hX"),(unsigned short)V_UI1(&var)); 
break; 
case VT_UI2: 
strRet = _T("VT_UI2"); 
break; 
case VT_UI4: 
strRet = _T("VT_UI4"); 
break; 
case VT_I8: 
strRet = _T("VT_I8"); 
break; 
case VT_UI8: 
strRet = _T("VT_UI8"); 
break; 
case VT_INT: 
strRet = _T("VT_INT"); 
break; 
case VT_UINT: 
strRet = _T("VT_UINT"); 
break; 
case VT_VOID: 
strRet = _T("VT_VOID"); 
break; 
case VT_HRESULT: 
strRet = _T("VT_HRESULT"); 
break; 
case VT_PTR: 
strRet = _T("VT_PTR"); 
break; 
case VT_SAFEARRAY: 
strRet = _T("VT_SAFEARRAY"); 
break; 
case VT_CARRAY: 
strRet = _T("VT_CARRAY"); 
break; 
case VT_USERDEFINED: 
strRet = _T("VT_USERDEFINED"); 
break; 
case VT_LPSTR: 
strRet = _T("VT_LPSTR"); 
break; 
case VT_LPWSTR: 
strRet = _T("VT_LPWSTR"); 
break; 
case VT_FILETIME: 
strRet = _T("VT_FILETIME"); 
break; 
case VT_BLOB: 
strRet = _T("VT_BLOB"); 
break; 
case VT_STREAM: 
strRet = _T("VT_STREAM"); 
break; 
case VT_STORAGE: 
strRet = _T("VT_STORAGE"); 
break; 
case VT_STREAMED_OBJECT: 
strRet = _T("VT_STREAMED_OBJECT"); 
break; 
case VT_STORED_OBJECT: 
strRet = _T("VT_STORED_OBJECT"); 
break; 
case VT_BLOB_OBJECT: 
strRet = _T("VT_BLOB_OBJECT"); 
break; 
case VT_CF: 
strRet = _T("VT_CF"); 
break; 
case VT_CLSID: 
strRet = _T("VT_CLSID"); 
break; 

WORD vt = var.vt; 
if(vt & VT_ARRAY){ 
#pragma warning(disable : 4244) 
vt = vt & ~VT_ARRAY; 
#pragma warning(default : 4244) 
strRet = _T("Array of "); 

if(vt & VT_BYREF){ 
#pragma warning(disable : 4244) 
vt = vt & ~VT_BYREF; 
#pragma warning(default : 4244) 
strRet += _T("Pointer to "); 

if(vt != var.vt){ 
switch(vt){ 
case VT_EMPTY: 
strRet += _T("VT_EMPTY"); 
break; 
case VT_NULL: 
strRet += _T("VT_NULL"); 
break; 
case VT_I2: 
strRet += _T("VT_I2"); 
break; 
case VT_I4: 
strRet += _T("VT_I4"); 
break; 
case VT_R4: 
strRet += _T("VT_R4"); 
break; 
case VT_R8: 
strRet += _T("VT_R8"); 
break; 
case VT_CY: 
strRet += _T("VT_CY"); 
break; 
case VT_DATE: 
strRet += _T("VT_DATE"); 
break; 
case VT_BSTR: 
strRet += _T("VT_BSTR"); 
break; 
case VT_DISPATCH: 
strRet += _T("VT_DISPATCH"); 
break; 
case VT_ERROR: 
strRet += _T("VT_ERROR"); 
break; 
case VT_BOOL: 
strRet += _T("VT_BOOL"); 
break; 
case VT_VARIANT: 
strRet += _T("VT_VARIANT"); 
break; 
case VT_UNKNOWN: 
strRet += _T("VT_UNKNOWN"); 
break; 
case VT_I1: 
strRet += _T("VT_I1"); 
break; 
case VT_UI1: 
strRet += _T("VT_UI1"); 
break; 
case VT_UI2: 
strRet += _T("VT_UI2"); 
break; 
case VT_UI4: 
strRet += _T("VT_UI4"); 
break; 
case VT_I8: 
strRet += _T("VT_I8"); 
break; 
case VT_UI8: 
strRet += _T("VT_UI8"); 
break; 
case VT_INT: 
strRet += _T("VT_INT"); 
break; 
case VT_UINT: 
strRet += _T("VT_UINT"); 
break; 
case VT_VOID: 
strRet += _T("VT_VOID"); 
break; 
case VT_HRESULT: 
strRet += _T("VT_HRESULT"); 
break; 
case VT_PTR: 
strRet += _T("VT_PTR"); 
break; 
case VT_SAFEARRAY: 
strRet += _T("VT_SAFEARRAY"); 
break; 
case VT_CARRAY: 
strRet += _T("VT_CARRAY"); 
break; 
case VT_USERDEFINED: 
strRet += _T("VT_USERDEFINED"); 
break; 
case VT_LPSTR: 
strRet += _T("VT_LPSTR"); 
break; 
case VT_LPWSTR: 
strRet += _T("VT_LPWSTR"); 
break; 
case VT_FILETIME: 
strRet += _T("VT_FILETIME"); 
break; 
case VT_BLOB: 
strRet += _T("VT_BLOB"); 
break; 
case VT_STREAM: 
strRet += _T("VT_STREAM"); 
break; 
case VT_STORAGE: 
strRet += _T("VT_STORAGE"); 
break; 
case VT_STREAMED_OBJECT: 
strRet += _T("VT_STREAMED_OBJECT"); 
break; 
case VT_STORED_OBJECT: 
strRet += _T("VT_STORED_OBJECT"); 
break; 
case VT_BLOB_OBJECT: 
strRet += _T("VT_BLOB_OBJECT"); 
break; 
case VT_CF: 
strRet += _T("VT_CF"); 
break; 
case VT_CLSID: 
strRet += _T("VT_CLSID"); 
break; 


return strRet; 
}

#3


up!!!

#4


如果知道类型那就用if else,如果不知道只能用swicth case 了

#5


顶一下就揭贴

#6


好,挺全的,谢谢

#1


strVARIANT

///crack.h
class CCrack 

public: 
static LPCTSTR strFieldType(short sType); 
static LPCTSTR strQueryDefType(short sType); 
static LPCTSTR strBOOL(BOOL bFlag); 
static CString strVARIANT(const COleVariant& var); 
}; 

///crack.cpp
#include "stdafx.h" 
#include "crack.h" 

LPCTSTR CCrack::strFieldType(short sType) 

switch(sType){ 
case (dbBoolean): 
return _T("Bool"); 
case (dbByte): 
return _T("Byte"); 
case (dbInteger): 
return _T("Integer"); 
case (dbLong): 
return _T("Long"); 
case (dbCurrency): 
return _T("Currency"); 
case (dbSingle): 
return _T("Single"); 
case (dbDouble): 
return _T("Double"); 
case (dbDate): 
return _T("Date"); 
case (dbText): 
return _T("Text"); 
case (dbLongBinary): 
return _T("Long Binary"); 
case (dbMemo): 
return _T("Memo"); 
case (dbGUID): 
return _T("GUID"); 

return _T("Unknown"); 


LPCTSTR CCrack::strQueryDefType(short sType) 

switch(sType){ 
case (dbQSelect): 
return _T("Select"); 
case (dbQAction): 
return _T("Action"); 
case (dbQCrosstab): 
return _T("Crosstab"); 
case (dbQDelete): 
return _T("Delete"); 
case (dbQUpdate): 
return _T("Update"); 
case (dbQAppend): 
return _T("Append"); 
case (dbQMakeTable): 
return _T("MakeTable"); 
case (dbQDDL): 
return _T("DDL"); 
case (dbQSQLPassThrough): 
return _T("SQLPassThrough"); 
case (dbQSetOperation): 
return _T("Set Operation"); 
case (dbQSPTBulk): 
return _T("SPTBulk"); 

return _T("Unknown"); 
}

#2


LPCTSTR CCrack::strBOOL(BOOL bFlag) 

return bFlag ? _T("TRUE") : _T("FALSE"); 


CString CCrack::strVARIANT(const COleVariant& var) 

CString strRet; 
strRet = _T("Fish"); 
switch(var.vt){ 
case VT_EMPTY: 
case VT_NULL: 
strRet = _T("NULL"); 
break; 
case VT_I2: 
strRet.Format(_T("%hd"),V_I2(&var)); 
break; 
case VT_I4: 
strRet.Format(_T("%d"),V_I4(&var)); 
break; 
case VT_R4: 
strRet.Format(_T("%e"),(double)V_R4(&var)); 
break; 
case VT_R8: 
strRet.Format(_T("%e"),V_R8(&var)); 
break; 
case VT_CY: 
strRet = COleCurrency(var).Format(); 
break; 
case VT_DATE: 
strRet = COleDateTime(var).Format(_T("%m %d %y")); 
break; 
case VT_BSTR: 
strRet = V_BSTRT(&var); 
break; 
case VT_DISPATCH: 
strRet = _T("VT_DISPATCH"); 
break; 
case VT_ERROR: 
strRet = _T("VT_ERROR"); 
break; 
case VT_BOOL: 
return strBOOL(V_BOOL(&var)); 
case VT_VARIANT: 
strRet = _T("VT_VARIANT"); 
break; 
case VT_UNKNOWN: 
strRet = _T("VT_UNKNOWN"); 
break; 
case VT_I1: 
strRet = _T("VT_I1"); 
break; 
case VT_UI1: 
strRet.Format(_T("0x%02hX"),(unsigned short)V_UI1(&var)); 
break; 
case VT_UI2: 
strRet = _T("VT_UI2"); 
break; 
case VT_UI4: 
strRet = _T("VT_UI4"); 
break; 
case VT_I8: 
strRet = _T("VT_I8"); 
break; 
case VT_UI8: 
strRet = _T("VT_UI8"); 
break; 
case VT_INT: 
strRet = _T("VT_INT"); 
break; 
case VT_UINT: 
strRet = _T("VT_UINT"); 
break; 
case VT_VOID: 
strRet = _T("VT_VOID"); 
break; 
case VT_HRESULT: 
strRet = _T("VT_HRESULT"); 
break; 
case VT_PTR: 
strRet = _T("VT_PTR"); 
break; 
case VT_SAFEARRAY: 
strRet = _T("VT_SAFEARRAY"); 
break; 
case VT_CARRAY: 
strRet = _T("VT_CARRAY"); 
break; 
case VT_USERDEFINED: 
strRet = _T("VT_USERDEFINED"); 
break; 
case VT_LPSTR: 
strRet = _T("VT_LPSTR"); 
break; 
case VT_LPWSTR: 
strRet = _T("VT_LPWSTR"); 
break; 
case VT_FILETIME: 
strRet = _T("VT_FILETIME"); 
break; 
case VT_BLOB: 
strRet = _T("VT_BLOB"); 
break; 
case VT_STREAM: 
strRet = _T("VT_STREAM"); 
break; 
case VT_STORAGE: 
strRet = _T("VT_STORAGE"); 
break; 
case VT_STREAMED_OBJECT: 
strRet = _T("VT_STREAMED_OBJECT"); 
break; 
case VT_STORED_OBJECT: 
strRet = _T("VT_STORED_OBJECT"); 
break; 
case VT_BLOB_OBJECT: 
strRet = _T("VT_BLOB_OBJECT"); 
break; 
case VT_CF: 
strRet = _T("VT_CF"); 
break; 
case VT_CLSID: 
strRet = _T("VT_CLSID"); 
break; 

WORD vt = var.vt; 
if(vt & VT_ARRAY){ 
#pragma warning(disable : 4244) 
vt = vt & ~VT_ARRAY; 
#pragma warning(default : 4244) 
strRet = _T("Array of "); 

if(vt & VT_BYREF){ 
#pragma warning(disable : 4244) 
vt = vt & ~VT_BYREF; 
#pragma warning(default : 4244) 
strRet += _T("Pointer to "); 

if(vt != var.vt){ 
switch(vt){ 
case VT_EMPTY: 
strRet += _T("VT_EMPTY"); 
break; 
case VT_NULL: 
strRet += _T("VT_NULL"); 
break; 
case VT_I2: 
strRet += _T("VT_I2"); 
break; 
case VT_I4: 
strRet += _T("VT_I4"); 
break; 
case VT_R4: 
strRet += _T("VT_R4"); 
break; 
case VT_R8: 
strRet += _T("VT_R8"); 
break; 
case VT_CY: 
strRet += _T("VT_CY"); 
break; 
case VT_DATE: 
strRet += _T("VT_DATE"); 
break; 
case VT_BSTR: 
strRet += _T("VT_BSTR"); 
break; 
case VT_DISPATCH: 
strRet += _T("VT_DISPATCH"); 
break; 
case VT_ERROR: 
strRet += _T("VT_ERROR"); 
break; 
case VT_BOOL: 
strRet += _T("VT_BOOL"); 
break; 
case VT_VARIANT: 
strRet += _T("VT_VARIANT"); 
break; 
case VT_UNKNOWN: 
strRet += _T("VT_UNKNOWN"); 
break; 
case VT_I1: 
strRet += _T("VT_I1"); 
break; 
case VT_UI1: 
strRet += _T("VT_UI1"); 
break; 
case VT_UI2: 
strRet += _T("VT_UI2"); 
break; 
case VT_UI4: 
strRet += _T("VT_UI4"); 
break; 
case VT_I8: 
strRet += _T("VT_I8"); 
break; 
case VT_UI8: 
strRet += _T("VT_UI8"); 
break; 
case VT_INT: 
strRet += _T("VT_INT"); 
break; 
case VT_UINT: 
strRet += _T("VT_UINT"); 
break; 
case VT_VOID: 
strRet += _T("VT_VOID"); 
break; 
case VT_HRESULT: 
strRet += _T("VT_HRESULT"); 
break; 
case VT_PTR: 
strRet += _T("VT_PTR"); 
break; 
case VT_SAFEARRAY: 
strRet += _T("VT_SAFEARRAY"); 
break; 
case VT_CARRAY: 
strRet += _T("VT_CARRAY"); 
break; 
case VT_USERDEFINED: 
strRet += _T("VT_USERDEFINED"); 
break; 
case VT_LPSTR: 
strRet += _T("VT_LPSTR"); 
break; 
case VT_LPWSTR: 
strRet += _T("VT_LPWSTR"); 
break; 
case VT_FILETIME: 
strRet += _T("VT_FILETIME"); 
break; 
case VT_BLOB: 
strRet += _T("VT_BLOB"); 
break; 
case VT_STREAM: 
strRet += _T("VT_STREAM"); 
break; 
case VT_STORAGE: 
strRet += _T("VT_STORAGE"); 
break; 
case VT_STREAMED_OBJECT: 
strRet += _T("VT_STREAMED_OBJECT"); 
break; 
case VT_STORED_OBJECT: 
strRet += _T("VT_STORED_OBJECT"); 
break; 
case VT_BLOB_OBJECT: 
strRet += _T("VT_BLOB_OBJECT"); 
break; 
case VT_CF: 
strRet += _T("VT_CF"); 
break; 
case VT_CLSID: 
strRet += _T("VT_CLSID"); 
break; 


return strRet; 
}

#3


up!!!

#4


如果知道类型那就用if else,如果不知道只能用swicth case 了

#5


顶一下就揭贴

#6


好,挺全的,谢谢