现有一个表 Table 里面的字段有 数字、字符、时间类型
怎么做能够把 table里指定的一个记录集中所有的字段值都得到,并赋值给一个CString的数组?下面是我自己写的,但是当获取,字符型 字段内容时就出错,怎样才能一气呵成的获取出来呢?CString *str = new CString[nLen];  // nLen是字段的个数
for (int j = 0; j < nLen; j++)
{
        str[j] = (CHAR*)_bstr_t(m_pRecordset->GetCollect(_bstr_t(strFields[j])));
}
delete []str;

解决方案 »

  1.   

    其他类型的需要转换一下,用ChangeType(.......).........
      

  2.   


    那在for循环中,怎么知道下一个字段是什么类型的呢?
      

  3.   

    FieldsPtr fds = m_pRecordset->Fields;
    for (int j = 0; j < fds->Count; j++)
    {
      DataTypeEnum type = fds->GetItem(_variant_t(j))->GetType();
    switch(type)
    {
    /*========================================================================
    returns: 返回下列值之一. 相应的 OLE DB 类型标识符在下表的说明栏的括
    号中给出.
      [常量] [说明] 
      ---------------------------------------------------------
      adArray 与其他类型一起加入逻辑 OR 以指示该数据是那种类型的
    安全数组 (DBTYPE_ARRAY). 
      adBigInt 8 字节带符号的整数 (DBTYPE_I8). 
      adBinary 二进制值 (DBTYPE_BYTES). 
      adBoolean 布尔型值 (DBTYPE_BOOL). 
      adByRef 与其他类型一起加入逻辑 OR 以指示该数据是其他类型数
    据的指针 (DBTYPE_BYREF). 
      adBSTR 以空结尾的字符串 (Unicode) (DBTYPE_BSTR). 
      adChar 字符串值 (DBTYPE_STR). 
      adCurrency 货币值 (DBTYPE_CY).货币数字的小数点位置固定、小数
    点右侧有四位数字.该值保存为 8 字节范围为10,000 的带符
    号整型值. 
      adDate 日期值 (DBTYPE_DATE).日期按双精度型数值来保存, 数
    字全部表示从 1899 年 12 月 30 开始的日期数.小数部分是
    一天当中的片段时间. 
      adDBDate 日期值 (yyyymmdd) (DBTYPE_DBDATE). 
      adDBTime 时间值 (hhmmss) (DBTYPE_DBTIME). 
      adDBTimeStamp 时间戳 (yyyymmddhhmmss 加 10 亿分之一的小数)(DBTYPE_DBTIMESTAMP). 
      adDecimal 具有固定精度和范围的精确数字值 (DBTYPE_DECIMAL). 
      adDouble 双精度浮点值 (DBTYPE_R8). 
      adEmpty 未指定值 (DBTYPE_EMPTY). 
      adError 32 - 位错误代码 (DBTYPE_ERROR). 
      adGUID 全局唯一的标识符 (GUID) (DBTYPE_GUID). 
      adIDispatch OLE 对象上 Idispatch 接口的指针 (DBTYPE_IDISPATCH). 
      adInteger 4 字节的带符号整型 (DBTYPE_I4). 
      adIUnknown OLE 对象上 IUnknown 接口的指针 (DBTYPE_IUNKNOWN).
      adLongVarBinary 长二进制值. 
      adLongVarChar 长字符串值. 
      adLongVarWChar 以空结尾的长字符串值. 
      adNumeric 具有固定精度和范围的精确数字值 (DBTYPE_NUMERIC). 
      adSingle 单精度浮点值 (DBTYPE_R4). 
      adSmallInt 2 字节带符号整型 (DBTYPE_I2). 
      adTinyInt 1 字节带符号整型 (DBTYPE_I1). 
      adUnsignedBigInt 8 字节不带符号整型 (DBTYPE_UI8). 
      adUnsignedInt 4 字节不带符号整型 (DBTYPE_UI4). 
      adUnsignedSmallInt 2 字节不带符号整型 (DBTYPE_UI2). 
      adUnsignedTinyInt 1 字节不带符号整型 (DBTYPE_UI1). 
      adUserDefined 用户定义的变量 (DBTYPE_UDT). 
      adVarBinary 二进制值. 
      adVarChar 字符串值. 
      adVariant 自动变体型 (DBTYPE_VARIANT). 
      adVector 与其他类型一起加入逻辑 OR 中, 指示数据是 DBVECTOR 
    结构(由 OLE DB 定义).该结构含有元素的计数和其他类型 
    (DBTYPE_VECTOR) 数据的指针. 
      adVarWChar 以空结尾的 Unicode 字符串. 
      adWChar 以空结尾的 Unicode 字符串 (DBTYPE_WSTR). 
        ----------------------------------------------------------
    Res: 返回指定字段的数据类型.
    ==========================================================================*/
    }
     }根据相应类型调用 GetCollect() 。
      

  4.   


    这个是OLE DB吗?我不太懂
    我是ADO的,我有点无知……请耐心
      

  5.   


    m_pRecordset->Fields 表示什么意思?是指一条记录集的所有字段个数吗?
    因为编译不过,自己也没调出来
      

  6.   

    你记录集中的每个字段、字段类型都定了的吗? 定了的话用case语句根据不同的字段类型进行分别处理。。
      

  7.   

    读取记录集数据,然后将数据转化成CString类型,然后添加到CString 中。
      

  8.   

    【解决了】最终试用版~哈哈
    CStringArray* pArray = new CStringArray; 
    pArray->SetSize(500);
    CString strInfo;
    _variant_t varIndex;
    _variant_t strVal;if (m_pRecordset->adoEOF)
    {
    return;
    }for (int j = 0; j < nLen; j++)
    {
    varIndex = _variant_t((long)(j));
    strVal= m_pRecordset->GetCollect(&varIndex);
    strInfo.Format("%s", (const char *)_bstr_t(strVal));
    pArray->SetAt(j, strInfo);
    strRetValue[j] = pArray->GetAt(j);
    }
      

  9.   

    【更简单的方法】// strFields[]字段集合, nLen字段的个数
    GetFieldsValue(CString strFields[], int nLen, CString strRetValue[])
    {
    if (m_pRecordset->adoEOF)
    {
    return;
    } for (int j = 0; j < nLen; j++)
    {
    strRetValue[j] = (const char *)_bstr_t(m_pRecordset->GetCollect(_variant_t(strFields[j])));
    }
    }