OLEDB接口读取各数据类型的转换方式(代码节录)

原创 2005年04月22日 20:24:00
    DBSTATUS dbStatus;
    DBTYPE dbType;
    CString str;
    double dValue; long lValue;

    // pAccessor 是一个指向CDynamicAccessor对象的指针
    // nCol是读取的列下标
    pAccessor->GetStatus(nCol, &dbStatus);

    if(dbStatus != DBSTATUS_S_ISNULL && pAccessor->GetColumnType(nCol, &dbType))
    {
        switch (dbType)
        {
        case DBTYPE_VARIANT:
            vt = COleVariant((LPCVARIANT)pAccessor->GetValue(nCol));
            break;
        case DBTYPE_STR:
            str = (LPCSTR)pAccessor->GetValue(nCol);
            break;
        case DBTYPE_WSTR:
        case DBTYPE_BSTR:
            str = (LPCWSTR)pAccessor->GetValue(nCol);
            break;
        case DBTYPE_I1:
        case DBTYPE_UI1:
            lValue = (long)(*((BYTE*)pAccessor->GetValue(nCol)));
            break;
        case DBTYPE_I2:
        case DBTYPE_UI2:
            lValue = (long)(*((short*)pAccessor->GetValue(nCol)));
            break;
        case DBTYPE_I4:
        case DBTYPE_UI4:
            lValue = (long)(*((long*)pAccessor->GetValue(nCol)));
            break;
        case DBTYPE_R4:
            dValue = (double)(*((float*)pAccessor->GetValue(nCol)));
            break;
        case DBTYPE_R8:
            dValue = *((double*)pAccessor->GetValue(nCol));
            break;
        case DBTYPE_NUMERIC:
            {
                DB_NUMERIC num;
                if(pAccessor->GetValue(nCol, &num))
                {
                    dValue = (double)*((__int64*)num.val);
                    while(num.scale-- > 0)
                        dValue /= 10;
                    if(num.sign == 0)
                        dValue = -dValue;
                }
            }
            break;
        case DBTYPE_VARNUMERIC:
            {
                // MSDN中有这部分的代码,不过有错误,这儿做了修正
                dValue = 0;
                unsigned long nColumn = nCol;
                DB_VARNUMERIC* pnum;
                pAccessor->TranslateColumnNo(nColumn);
                pnum = (DB_VARNUMERIC*)pAccessor->_GetDataPtr(nColumn);

                ULONG uLength = 0;
                pAccessor->GetLength(nCol, &uLength);

                int prec = ( int )pnum->precision;
                int scale = ( int )pnum->scale;
                int sign = ( int ) ( pnum->sign > 0 ) ? 1 : -1;

                BYTE hi, lo;
                double multiplier = 1;
                double adjust = 1;

                uLength -= (sizeof(DBTYPE_VARNUMERIC) - 1);
                for( ULONG i = 0, j = 0 ; i < uLength ; i++, j+=2 )
                {
                    hi = lo = pnum->val[ i ];
                    lo <<= 4;
                    lo >>= 4;
                    dValue += ( ( ( ULONG ) lo ) * multiplier );
                    multiplier *= 16;
                    hi >>= 4;
                    dValue += ( ( ( ULONG ) hi ) * multiplier );
                    multiplier *= 16;
                }
                adjust *= pow(10, scale) * sign;
                dValue /= adjust;
            }
            break;
        case DBTYPE_DBDATE:
            {
                DBDATE dbDate;
                if (pAccessor->GetValue(nCol, &dbDate))
                {
                    CTime tm(dbDate.year, dbDate.month, dbDate.day, 0, 0, 0);
                }
            }
            break;
        case DBTYPE_DBTIMESTAMP:
            {
                DBTIMESTAMP dbTimeStamp;

                if(pAccessor->GetValue(nCol, &dbTimeStamp))
                {
                    CTime tm(dbTimeStamp.year, dbTimeStamp.month, dbTimeStamp.day,
                        dbTimeStamp.hour, dbTimeStamp.minute, dbTimeStamp.second);
                    lValue = tm.GetTime();
                }
            }
            break;
        case DBTYPE_DATE:
            {
                COleDateTime dt(*((DATE*)pAccessor->GetValue(nCol)));
                lValue = dt.GetYear() * 10000 + dt.GetMonth() * 10000 + dt.GetDay();
            }
            break;
        case DBTYPE_DBTIME:
            {
                DBTIME dbTime;
                if(pAccessor->GetValue(nCol, &dbTime))
                {
                    dt.SetTime(dbTime.hour, dbTime.minute, dbTime.second);
                    vt = COleVariant(dt);
                }
            }
            break;
        case DBTYPE_CY:
            {
                COleCurrency cy(*((CURRENCY*)pAccessor->GetValue(nCol)));
                vt = COleVariant(cy);
            }
            break;
        case DBTYPE_IUNKNOWN:
            {
                ISequentialStream* pStream = *(ISequentialStream**)pAccessor->GetValue(nCol);
                if (pStream != NULL )
                {
                    CString str;
                    unsigned long lRead = 0;
                    unsigned long lReadThis = 0;
                    CByteArray ayBytes;
                    BYTE szBuffer[4096];
                    BYTE* pByte = NULL;
                    do
                    {

                        pStream->Read(szBuffer, 4096, &lReadThis);
                        if (lReadThis > 0)
                        {
                            ayBytes.SetSize(lRead + lReadThis);
                            pByte = ayBytes.GetData();
                            memcpy(pByte + lRead, szBuffer, lReadThis);
                            lRead += lReadThis;
                        }
                    } while (lReadThis == 4096);
                    ayBytes.SetSize(lRead);
                    vt = ayBytes;

                }
            }
            break;
        case DBTYPE_NULL:
        case DBTYPE_EMPTY:
        default:
            break;
        }
    }

使用OLEDB方式读取Excel文件到DataTable中数据类型的处理

首先看一段实例代码 string strCon = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel_path + ";Exte...

解决Oledb连接Excel数据类型不统一的问题

在使用Microsoft.Jet.OLEDB.4.0连接Excel,进行读取数据,相对使用传统的COM来读取数据,效率是很高的。但相对传统COM操作Excel来说,及存在数据类型转换的问题。 因...

彻底解决Oledb连接Excel数据类型不统一的问题

摘要 Oledb读取Excel时,同一列如果有多种数据类型,会有问题,同时解决无法读取第一行的问题 彻底解决Oledb连接Excel数据类型不统一的问题 在使用Microsoft.Jet.O...
  • singgel
  • singgel
  • 2016年09月13日 10:08
  • 1116

关于Gson的各数据类型转换代码包

  • 2016年02月27日 20:54
  • 192KB
  • 下载

oracle数据类型及存储方式.doc

  • 2012年11月06日 18:36
  • 346KB
  • 下载

Visual C++调用WebService服务接口常见数据类型转换

本文总结了C++调用webservice接口并向其插入时间类型、时间差、二进制流、浮点类型、_int64类型、std::string类型时,数据获取方式以及插入过程中需要进行的数据处理,如ASCIIz...

OLEDB方式读取Excel丢失数据、字符串截断的原因和解决方法

1 引言   在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用。笔者在开发“汽车产...
  • DMX66
  • DMX66
  • 2014年08月05日 15:37
  • 304

c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件

Microsoft Jet 提供程序用于连接到 Excel 工作簿。在以下连接字符串中,Extended Properties 关键字设置 Excel 特定的属性。“HDR=Yes;”指示第一行中包含...
  • ngvjai
  • ngvjai
  • 2012年09月15日 16:33
  • 1038
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OLEDB接口读取各数据类型的转换方式(代码节录)
举报原因:
原因补充:

(最多只允许输入30个字)