ADO中_variant_t变量的使用与转换

转自:http://blog.csdn.net/zyq5945/article/details/5581453


下载 源代码

用ADO做数据库,有个麻烦的事情就是_variant_t变量的使用,使用本例中封装的CConvert类转换就方便了。

// Convert.h: interface for the CConvert class.
//
//
#if !defined(AFX_CONVERT_H__EC38F865_4607_4659_BAC8_AA6096C50EC7__INCLUDED_)
#define AFX_CONVERT_H__EC38F865_4607_4659_BAC8_AA6096C50EC7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//
// Construction/Destruction
/* 
* Copyright (c) 2010,zyq5945@126.com
* All rights reserved. 
*  
* 文件名称:Convert.h 
* 文件标识:数据类型转换
* 摘    要:主要简化ADO中数据类型的转换 
*  
* 当前版本:1.0 
* 作    者:zyq5945@126.com(注意把中文字符换成英文字符)
* 完成日期:2010年5月11日 
* 发布Blog:http://blog.csdn.net/zyq5945/ 
* 
*/ 
//
#define TS(value) CConvert::ToString(value)
class CConvert  
{
	
public:
	static CString ToString(BYTE btValue);
	static CString ToString(int iValue);
	static CString ToString(unsigned int iValue);
	static CString ToString(long lValue);
	static CString ToString(unsigned long lValue);
	static CString ToString(__int64 i64Value);
	static CString ToString(unsigned __int64 i64Value);
	static CString ToString(float fltValue);
	static CString ToString(double dblValue);
	static CString ToString(const COleDateTime& time);
	static CString ToString(const _variant_t& var);
public:
	static BYTE ToByte(LPCTSTR lpszValue);
	static int ToInt(LPCTSTR lpszValue);
	static unsigned int ToUInt(LPCTSTR lpszValue);
	static long ToLong(LPCTSTR lpszValue);
	static unsigned long ToULong(LPCTSTR lpszValue);
	static __int64 ToInt64(LPCTSTR lpszValue);
	static unsigned __int64 ToUInt64(LPCTSTR lpszValue);
	static float ToFloat(LPCTSTR lpszValue);
	static double ToDouble(LPCTSTR lpszValue);
	static COleDateTime ToTime(LPCTSTR lpszValue);
	static _variant_t ToVariant(const COleDateTime& time);
};
extern CConvert Convert;
#endif // !defined(AFX_CONVERT_H__EC38F865_4607_4659_BAC8_AA6096C50EC7__INCLUDED_)
// Convert.cpp: implementation of the CConvert class.
//
//
#include "stdafx.h"
#include "Convert.h"
#include <comutil.h>
#include <comdef.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
/* 
* Copyright (c) 2010,zyq5945@126.com
* All rights reserved. 
*  
* 文件名称:Convert.cpp 
* 文件标识:数据类型转换
* 摘    要:主要简化ADO中数据类型的转换 
*  
* 当前版本:1.0 
* 作    者:zyq5945@126.com(注意把中文字符换成英文字符)
* 完成日期:2010年5月11日 
* 发布Blog:http://blog.csdn.net/zyq5945/
* 
*/ 
//
CConvert Convert;
CString CConvert::ToString(BYTE btValue)
{
	CString strValue;
	strValue.Format(_T("%d"), btValue);
	return strValue;
}
CString CConvert::ToString(int iValue)
{
	CString strValue;
	strValue.Format(_T("%d"), iValue);
	return strValue;
}
CString CConvert::ToString(unsigned int iValue)
{
	CString strValue;
	strValue.Format(_T("%u"), iValue);
	return strValue;
}
CString CConvert::ToString(long lValue)
{
	CString strValue;
	strValue.Format(_T("%d"), lValue);
	return strValue;
}
CString CConvert::ToString(unsigned long lValue)
{
	CString strValue;
	strValue.Format(_T("%u"), lValue);
	return strValue;
}
CString CConvert::ToString(__int64 i64Value)
{
	CString strValue;
	strValue.Format(_T("%I64d"), i64Value);
	return strValue;
}
CString CConvert::ToString(unsigned __int64 i64Value)
{
	CString strValue;
	strValue.Format(_T("%I64u"), i64Value);
	return strValue;
}
CString CConvert::ToString(float fltValue)
{
	CString strValue;
	strValue.Format(_T("%f"), fltValue);
	return strValue;
}
CString CConvert::ToString(double dblValue)
{
	CString strValue;
	strValue.Format(_T("%f"), dblValue);
	return strValue;
}
// 时间输出格式:2010-05-06 22:07:08
CString CConvert::ToString(const COleDateTime& time)
{
	CString strValue;
	strValue = time.Format(_T("%Y-%m-%d %H:%M:%S"));
	return strValue;
}
CString CConvert::ToString(const _variant_t& var)
{
	CString strValue;
	switch (var.vt)
	{
	case VT_BSTR: //字符串
	case VT_LPSTR:
	case VT_LPWSTR:
		strValue = (LPCTSTR)(_bstr_t)var;
		break;
	case VT_I1:   //无符号字符
	case VT_UI1:
		strValue.Format(_T("%d"), var.bVal);
		break;
	case VT_I2:   //短整型
		strValue.Format(_T("%d"), var.iVal);
		break;
	case VT_UI2:   //无符号短整型
		strValue.Format(_T("%u"), var.uiVal);
		break;
	case VT_INT: //整型
		strValue.Format(_T("%d"), var.intVal);
		break;
	case VT_I4:   //整型
	case VT_I8:   //长整型
		strValue.Format(_T("%d"), var.lVal);
		break;
	case VT_UINT:   //无符号整型
		strValue.Format(_T("%d"), var.uintVal);
		break;
	case VT_UI4:    //无符号整型
	case VT_UI8:    //无符号长整型
		strValue.Format(_T("%d"), var.ulVal);
		break;
	case VT_VOID:
		strValue.Format(_T("%08x"), var.byref);
		break;
	case VT_R4:   //浮点型
		strValue.Format(_T("%f"), var.fltVal);
		break;
	case VT_R8:   //双精度型
		strValue.Format(_T("%f"), var.dblVal);
		break;
	case VT_DECIMAL: //小数
		strValue.Format(_T("%f"), (double)var);
		break;
	case VT_CY:
		{
			COleCurrency cy = var.cyVal;
			strValue = cy.Format();
		}
		break;
	case VT_BLOB:
	case VT_BLOB_OBJECT:
	case 0x2011:
		strValue = _T("[BLOB]");
		break;
	case VT_BOOL:   //布尔型  
		strValue = var.boolVal ? _T("TRUE") : _T("FALSE");
		break;
	case VT_DATE: //日期型
		{
			DATE dt = var.date;
			COleDateTime da = COleDateTime(dt);
			strValue = da.Format(_T("%Y-%m-%d %H:%M:%S"));
		}
		break;
	case VT_NULL://NULL值
	case VT_EMPTY:   //空
		strValue = _T("");
		break;
	case VT_UNKNOWN:   //未知类型
	default:
		strValue = _T("VT_UNKNOW");
		break;
	}
	
	return strValue;
}
BYTE CConvert::ToByte(LPCTSTR lpszValue)
{
	BYTE btValue;
	btValue = (BYTE)_ttoi(lpszValue);
	return btValue;
}
int CConvert::ToInt(LPCTSTR lpszValue)
{
	int iValue;
	iValue = _ttoi(lpszValue);
	return iValue;
}
unsigned int CConvert::ToUInt(LPCTSTR lpszValue)
{
	unsigned int iValue;
	iValue = _ttoi(lpszValue);
	return iValue;
}
long CConvert::ToLong(LPCTSTR lpszValue)
{
	long lValue;
	lValue = _ttol(lpszValue);
	return lValue;
}
unsigned long CConvert::ToULong(LPCTSTR lpszValue)
{
	unsigned long lValue;
	lValue = _ttol(lpszValue);
	return lValue;
}
__int64 CConvert::ToInt64(LPCTSTR lpszValue)
{
	__int64 i64Value;
	i64Value = _ttoi64(lpszValue);
	return i64Value;
}
unsigned __int64 CConvert::ToUInt64(LPCTSTR lpszValue)
{
	unsigned __int64 i64Value;
	i64Value = _ttoi64(lpszValue);
	return i64Value;
}
float CConvert::ToFloat(LPCTSTR lpszValue)
{
	float fltValue;
#ifdef _MBCS
	fltValue = (float)atof(lpszValue);
#else
	fltValue = (float)wtof(lpszValue);
#endif
	return fltValue;
}
double CConvert::ToDouble(LPCTSTR lpszValue)
{
	double dblValue;
#ifdef _MBCS
	dblValue = atof(lpszValue);
#else
	dblValue = wtof(lpszValue);
#endif
	return dblValue;
}
// 时间格式例子:2010-05-06 22:07:08
//				 2010 05 06 22 07 08
//				 2010:05:06 22:07:08
//				 2010-05-06-22-07-08
// 只要是“- :”分割的时间格式都符合
COleDateTime CConvert::ToTime(LPCTSTR lpszValue)
{
	unsigned int iArray[6] = {2010, 5, 11, 12, 00, 00};
	int nIndex = 0;
#if _MSC_VER >= 1310  //VC6.0不支持CStringAlt::Tokenize
	CString strTmp;
	int curPos = 0;
	CString strValue(lpszValue);
	
	strTmp = strValue.Tokenize(_T("- :"),curPos);
	while (strTmp != _T("") && nIndex <6)
	{
		iArray[nIndex++] = ToUInt(strTmp);
		strTmp = strValue.Tokenize(_T("- :"), curPos);
	};
#else
	TCHAR tChar[MAX_PATH] = {0};
	TCHAR tCharTmp[MAX_PATH] = {0};
	TCHAR seps[]   = "- :";
	TCHAR *next_token = NULL;
	ASSERT(_tcslen(lpszValue) < MAX_PATH);
	RtlCopyMemory(tChar, lpszValue, _tcslen(lpszValue) * sizeof(TCHAR));
	next_token = _tcstok(tChar, seps);
	while ( next_token != NULL && nIndex <6)
	{
		iArray[nIndex++] = _ttoi(next_token);
		next_token = _tcstok( NULL, seps);
	}
	
#endif
	COleDateTime time(iArray[0], iArray[1], iArray[2],
		iArray[3], iArray[4], iArray[5]);
	return time;
}
_variant_t CConvert::ToVariant(const COleDateTime& time)
{
	_variant_t vtVal;
	
	vtVal.vt = VT_DATE;
	vtVal.date = time;
	return vtVal;
}

由于_variant_t重载了以下等号运算符,所以下面类型可以直接给_variant_t赋值

VARIANT 
VARIANT* 
_variant_t
short 
long
float
double
CY
_bstr_t
wchar_t
char
IDispatch*
bool
IUnknown*
DECIMAL
BYTE
char
unsigned short
unsigned long
int
unsigned int
__int64
unsigned __int64

由于 COleDateTime  重载了以下等号运算符,所以下面类型可以直接给 COleDateTime  赋值

VARIANT
DATE
time_t
__time64_t
SYSTEMTIME
FILETIME
UDATE

本例中CConvert类也增加了一个ToVariant函数把 COleDateTime转换为_variant_t类型变量

	_variant_t varValue;
	CString strValue;
	COleDateTime dt;
	try
	{
		// 写入各字段值
		m_pRecordset->AddNew();
		// byte变量
		GetDlgItemText(IDC_EDIT1, strValue);
		varValue = CConvert::ToByte(strValue);	
		m_pRecordset->PutCollect("tByte", varValue);
		
		// int变量
		GetDlgItemText(IDC_EDIT2, strValue);
		varValue = (long)CConvert::ToInt(strValue);	
		m_pRecordset->PutCollect("tInt", varValue);
		// long变量
		GetDlgItemText(IDC_EDIT3, strValue);
		varValue = CConvert::ToLong(strValue);	
		m_pRecordset->PutCollect("tLong", varValue);
		// float变量
		GetDlgItemText(IDC_EDIT4, strValue);
		varValue = CConvert::ToFloat(strValue);	
		m_pRecordset->PutCollect("tFloat", varValue);
		// double变量
		GetDlgItemText(IDC_EDIT5, strValue);
		varValue = CConvert::ToDouble(strValue);	
		m_pRecordset->PutCollect("tDouble", varValue);
		// COleDateTime变量
		GetDlgItemText(IDC_EDIT6, strValue);
		dt = CConvert::ToTime(strValue);
		varValue = CConvert::ToVariant(dt);
		m_pRecordset->PutCollect("tTime", varValue);
		// bool变量
		GetDlgItemText(IDC_EDIT7, strValue);
		if (!strValue.CompareNoCase("TRUE"))
		{
			varValue = true;
		}
		else
		{
			varValue = false;
		}
		m_pRecordset->PutCollect("tBool", varValue);
		// 字符串变量
		GetDlgItemText(IDC_EDIT8, strValue);
		varValue = strValue;
		m_pRecordset->PutCollect("tText", varValue);
		m_pRecordset->Update();
		
		// 更新显示其库内容
		int nCurSel = m_list.GetItemCount();
		ADOListRecord();
		SetListSel(nCurSel);
	
		AfxMessageBox("插入成功!");
	}
	catch(_com_error& e)
	{
		dump_com_error(e);
	}

参考文献: ADO数据库编程-总结2
一下文章转自: http://hi.baidu.com/sunkanghome/blog/item/cea70101bdb177031d95839a.html

ADO数据库编程-总结2

三、ADO中的数据类型

        在使用ADO技术操作数据库时,存取变量的数据类型都是COM类型,这就要求经常在COM类型和普通数据类型之间进行类型转换。

         ADO中特有的数据类型包括以下三种:

         1)Variant

               该类型是结构化的数据类型,它包含值成员和数据类型成员。

               Variant可以包含许多其他的数据类型:如Variant、BSTR、Boolean、IDispatch或者IUnknow指针、货币、日期等。

                COM中由_variant_t 类来封装和管理Variant数据类型

                在使用ADO对象模型操作数据库时,如果对象的某个方法或者属性操作数接受某个值,那么通常表明该值在_variant_t 中传递。

                注:在利用ADO对象进行C++数据类型的相关数据库操作(如将CString类型的值添加到数据库)时,需要进行强制类型转换

                       例如:对于   CString m_strName;

                                               m_pRecordset->PutCollect ( "姓名" , _variant_t ( m_strName ) );

          2)BSTR

                该类型 ( Basic STRing )也是结构化的数据类型,它包含字符串和字符串的长度。

                COM提供分配、处理和释放BSTR的方法,由_bstr_t类来封装和管理BSTR数据类型

                在使用ADO对象模型操作数据库时,如果对象的某个方法或者属性操作数接受一个字符串值,那么通常表明该值的形式为_bstr_t,而非一般的CString

          3)SafeArray

                同样是一种结构化的数据类型,包含其它数据类型的数组

                在使用ADO对象模型操作数据库时,如果对象的某个方法或者属性操作数接受或者返回一个数组,则数组类型只能是SafeArray,而非通常意义上的C/C++数组

      通常,从数据库中取出的字段值大都在_variant_t中传递,下面给出从COM类型Variant向CString类型转换的通用函数。

      该函数将为数据库的访问和操作提供极大便利。

CString CLeftTreeView::VariantToCString(const _variant_t &var)
{
      CString strValue; 
     switch (var.vt)
     {
      case VT_BSTR: //字符串
      case VT_LPSTR:
      case VT_LPWSTR:
              strValue = (LPCTSTR)(_bstr_t)var;
              break;
      case VT_I1:   //无符号字符
      case VT_UI1:
             strValue.Format("%d", var.bVal);
            break;
      case VT_I2:   //短整型
            strValue.Format("%d", var.iVal);
           break;
       case VT_UI2:   //无符号短整型
              strValue.Format("%d", var.uiVal);
              break;
       case VT_INT: //整型
              strValue.Format("%d", var.intVal);
             break;
      case VT_I4:   //整型
      case VT_I8:   //长整型
              strValue.Format("%d", var.lVal);
              break;
       case VT_UINT:   //无符号整型
              strValue.Format("%d", var.uintVal);
              break;
     case VT_UI4:    //无符号整型
      case VT_UI8:    //无符号长整型
              strValue.Format("%d", var.ulVal);
              break;
      case VT_VOID:
              strValue.Format("%8x", var.byref);
              break;
      case VT_R4:   //浮点型
              strValue.Format("%.4f", var.fltVal);
             break;
      case VT_R8:   //双精度型
              strValue.Format("%.8f", var.dblVal);
              break;
      case VT_DECIMAL: //小数
               strValue.Format("%.8f", (double)var);
             break;
      case VT_CY:
                       {
                                   COleCurrency cy = var.cyVal;
                                  strValue = cy.Format();
                       }
                     break;
       case VT_BLOB:
      case VT_BLOB_OBJECT:
      case 0x2011:
                 strValue = "[BLOB]";
                 break;
      case VT_BOOL:   //布尔型  
                  strValue = var.boolVal ? "TRUE" : "FALSE";
                break;
      case VT_DATE: //日期型
                          {
                                   DATE dt = var.date;
                                   COleDateTime da = COleDateTime(dt); 
                                   strValue = da.Format("%Y-%m-%d %H:%M:%S");
                          }
                break;
      case VT_NULL://NULL值
      case VT_EMPTY:   //空
                    strValue = "";
                    break;
       case VT_UNKNOWN:   //未知类型
       default:
              strValue = "UN_KNOW";
              break;
      }
      return strValue;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值