您的位置:首页 > 数据库

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息