ADO数据库编程-总结2
2011-12-25 16:28
330 查看
三、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;
}
FROM:http://hi.baidu.com/sunkanghome/blog/item/cea70101bdb177031d95839a.html
在使用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;
}
FROM:http://hi.baidu.com/sunkanghome/blog/item/cea70101bdb177031d95839a.html
相关文章推荐
- ADO数据库编程 - 总结
- ADO数据库编程总结
- ADO数据库编程总结(一)
- ADO数据库编程 - 总结
- VC++MFC ADO数据库编程实现与总结
- ADO数据库编程总结(二)
- ADO数据库编程 - 总结
- ADO数据库编程-总结1
- ADO数据库编程--总结
- ADO数据库编程 - 总结
- ADO数据库编程 - 总结
- 相关的连接与操纵数据库的编程方法之ADO连接access数据库
- VC 数据库编程 ADO
- 在Visual C++中用ADO进行数据库编程
- 对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式
- 数据库开发个人总结(ADO.NET小结)
- 数据库开发总结(ADO.NET小结)
- 数据库开发个人总结(ADO.NET小结)
- 读书笔记——数据库的ADO开发总结
- 数据库开发个人总结(ADO.NET小结)