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数据类型不统一的问题

http://www.klipdas.com/blog/?p=%E5%BD%BB%E5%BA%95%E8%A7%A3%E5%86%B3oledb%E8%BF%9E%E6%8E%A5excel%E6%9...
  • fupei
  • fupei
  • 2010年09月15日 15:19
  • 5662

C++数据类型转换(转)全!

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://whuhutu.blogbus.com/logs/1819202.html   int i = 100; lon...
  • jfx
  • jfx
  • 2011年10月15日 10:28
  • 2497

OLEDB对数据库的操作心得(一)数据表及数据结构的填充

最近使用OLEDB编写一个mdb数据表录入程序小有心得,现总结如何: 一、.数据表及数据结构的填充 1.使用OLEDBConnection配合连接字符串进行数据库连接,连接字符串汇总如下: a.对...
  • dibowei2069
  • dibowei2069
  • 2016年01月13日 10:12
  • 476

利用OleDb对象,将数据库中全部表转换成...【转】

ASP.NET Dataset让你在页面中使用XML格式的文件提供了便利。如果您的数据全部都在一个数据库中,该如何进行转换呢?如果你的数据库与OleDb兼容的话,下面就看看如何把数据库中的所有表转换成...
  • u010158775
  • u010158775
  • 2015年02月12日 15:41
  • 414

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

DBSTATUS dbStatus; DBTYPE dbType; CString str; double dValue; long lValue; // pAcce...
  • Heway
  • Heway
  • 2005年04月22日 20:24
  • 1817

OleDB访问数据库的连接字符串格式

Excel 97-2003 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;Extended...
  • ennaymonkey
  • ennaymonkey
  • 2018年01月17日 20:28
  • 55

利用OleDb导入Excel数据丢失问题及解决方法

在开发的应用中,对于Excel数据导入,一直都利用OleDb,以前都收到用户反馈有啥问题。但这几天搞一个项目,也用到了这个东西,还在测试阶段就发现出了问题:经常会出现某一字段不允许有空值。按常规的认识...
  • gaofeng2000
  • gaofeng2000
  • 2013年08月29日 12:33
  • 2163

通过oledb驱动读取excel、csv数据丢失解决方案

1、问题出现       在开发应用程序的过程中,比较常用一功能就是通过oledb驱动读取excel、csv、text等文件;而最近有客户反映,在使用短信平台(下载地址:http://www.sms...
  • zsy619
  • zsy619
  • 2017年02月23日 08:28
  • 543

利用OleDb将xml文件的数据导入到数据库中

Html代码:@ Page Language="C#" AutoEventWireup="true" CodeFile="xmlole.aspx.cs" Inherits="xmlole" %> DO...
  • Teng_s2000
  • Teng_s2000
  • 2007年04月10日 16:58
  • 1535

使用oledb获取Excel文件第一个工作表数据

原地址:http://blog.csdn.net/sunyou/article/details/6888148 使用Microsoft.Jet.OLEDB读取Excel文件时需要在sql中指定表...
  • rztyfx
  • rztyfx
  • 2016年09月06日 17:14
  • 596
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OLEDB接口读取各数据类型的转换方式(代码节录)
举报原因:
原因补充:

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