ADO数据库编程-总结2

本文介绍了在使用ADO技术操作数据库时涉及到的三种特有数据类型:Variant、BSTR和SafeArray。详细阐述了这些数据类型的特性及其在ADO中的应用,并提供了一个从COM类型Variant向CString类型转换的通用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


三、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值