OLEDB接口读取各数据类型的转换方式(代码节录)
2005-04-22 20:24
721 查看
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; } }
相关文章推荐
- XCode数据类型转换代码 文件读取,写入,XY坐标获取,ASCII转换等
- 使用OLEDB方式读取Excel文件到DataTable中数据类型的处理
- XCode数据类型转换代码 文件读取,写入,XY坐标获取,ASCII转换等
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- Long和Date数据类型之间相互转换代码
- C# 几种数据类型转换方式
- 字符数据类型转换代码
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
- 将对象直接转换为接口应用的代码例子, 注意其中用了 as 方式, 很有意思
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(10):服务器端和客户端数据类型的自动转换:以XML方式序列化数据、小结
- OLEDB方式读取Excel丢失数据的原因和解决方法
- JAVA中数据的读取与写入,不同类型数据的转换
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- Golang 如何定义一个接口类型的切片,它可以用来存储混合类型的数据,又如何自定义错误信息输出,以及如何定义变参函数,还有字符串多种拼接方式
- 数据类型转换(代码总结)
- windows读取bmp格式图像代码移植linux;windows代码移植linux,数据类型不匹配我问题;
- sas数据读取详解:SAS读取小工具,读取数值类型的注意事项,lrecl选项,四种读取数据方式以及数据指针的位置、读取mess data的、infile语句及其选项(dsd dlm missover truncover obs firstobs)、proc import、自定义缺失值
- Java 读取Excel表格数据日期类型转换
- C#调用C++的DLL 所有数据类型转换方式