📄 xolestrvariant.cpp
字号:
// XOleStrVariant.cpp: implementation of the XOleStrVariant class
#include "stdafx.h"
#include <OLEDB.h>
#include "XOleStrVariant.h"
//////////////////////////////////////////////////////////////////////
#define WStrToStr(s, d, n) WideCharToMultiByte(CP_ACP, 0, s, -1, d, n, NULL, NULL)
void XTrimCopyString(LPCTSTR lpSrc, LPTSTR lpDest, DWORD dwSize)
{
DWORD i;
for(i = 0; i < dwSize; i ++)
{
if(lpSrc[i] == 0x00)
break;
}
lpDest[i] = 0x00;
memcpy(lpDest, lpSrc, i);
while(lpSrc[i] >= 0x00 && lpSrc[i] < 0x21)
{
lpDest[i] = 0x00;
if(i -- == 0) return;
}
}
void XTrimCopyWString(LPCWSTR lpSrc, LPTSTR lpDest, DWORD dwSize)
{
DWORD i;
WCHAR lpSave[4098];
memcpy(lpSave, lpSrc, dwSize);
for(i = 0; i < dwSize; i ++)
{
if(lpSave[i] == 0x00)
break;
}
lpSave[i] = 0x00;
i = WStrToStr(lpSave, lpDest, dwSize + 1) - 1;
while(lpDest[i] >= 0x00 && lpDest[i] < 0x21)
{
lpDest[i] = 0x00;
if(i -- == 0) return;
}
}
// 数据转换函数
void XFormatOleVariant(DWORD dwType, LPVOID lpSrc, LPTSTR lpBuffer, DWORD dwSize)
{
switch( dwType )
{
case DBTYPE_I2: // short
sprintf(lpBuffer, "%hd", *((short *)lpSrc));
break;
case DBTYPE_UI2: // WORD
sprintf(lpBuffer, "%hu", *((WORD *)lpSrc));
break;
case DBTYPE_I4: // long
sprintf(lpBuffer, "%ld", *((long *)lpSrc));
break;
case DBTYPE_UI4: // DWORD
sprintf(lpBuffer, "%lu", *((DWORD *)lpSrc));
break;
case DBTYPE_I8: // __int64
sprintf(lpBuffer, "%I64d", *((LONGLONG *)lpSrc));
break;
case DBTYPE_UI8: // ULONGLONG
sprintf(lpBuffer, "%I64u", *((ULONGLONG *)lpSrc));
break;
case DBTYPE_R4: // float
sprintf(lpBuffer, "%f", *((float *)lpSrc));
break;
case DBTYPE_R8: // double
sprintf(lpBuffer, "%lf", *((double *)lpSrc));
break;
case DBTYPE_BOOL: // VARIANT_BOOL
if( *((VARIANT_BOOL *)lpSrc) )
lstrcpy(lpBuffer, "TRUE");
else
lstrcpy(lpBuffer, "FALSE");
break;
case DBTYPE_STR: // string
XTrimCopyString((LPCTSTR)lpSrc, lpBuffer, dwSize);
break;
case DBTYPE_BSTR:
case DBTYPE_WSTR: // wide string
XTrimCopyWString((LPCWSTR)lpSrc, lpBuffer, dwSize);
break;
case DBTYPE_CY: // currency
{
LONGLONG nCur = *((__int64 *)lpSrc);
sprintf(lpBuffer, "%d.%04d", nCur / 10000, nCur % 10000);
}
break;
case DBTYPE_DBTIMESTAMP: // DBTIMESTAMP
{
DBTIMESTAMP *lpTime = (DBTIMESTAMP *)lpSrc;
sprintf( lpBuffer, "%d-%02d-%02d %02d:%02d:%02d",
lpTime->year, lpTime->month, lpTime->day,
lpTime->hour, lpTime->minute, lpTime->second );
}
break;
default :
strcpy(lpBuffer, "---UnKnown---");
}
}
void XScanOleVariant(DWORD dwType, LPCTSTR lpSrc, LPVOID lpDest)
{
}
void XFormSQLServerType(DWORD dwType, DWORD dwSize, LPTSTR lpType)
{
switch( dwType )
{
case DBTYPE_I2: // short
case DBTYPE_UI2: // WORD
case DBTYPE_BOOL: // VARIANT_BOOL
lstrcpy(lpType, "SMALLINT");
break;
case DBTYPE_I4: // long
case DBTYPE_UI4: // DWORD
lstrcpy(lpType, "INT");
break;
case DBTYPE_R4: // float
lstrcpy(lpType, "REAL");
break;
case DBTYPE_R8: // double
lstrcpy(lpType, "FLOAT");
break;
case DBTYPE_STR: // string
sprintf(lpType, "VARCHAR(%d)", dwSize - 2);
break;
case DBTYPE_BSTR: // Basic str
case DBTYPE_WSTR: // wide string
sprintf(lpType, "VARCHAR(%d)", dwSize / 2 - 2);
break;
case DBTYPE_CY: // currency
lstrcpy(lpType, "MONEY");
break;
case DBTYPE_DBTIMESTAMP: // DBTIMESTAMP
lstrcpy(lpType, "TIMESTAMP");
break;
default :
lstrcpy(lpType, "--UnKnown--");
}
}
/*
void XFormatOleDate(double dbDate, LPTSTR lpBuffer)
{
double dbTime;
BOOL bLeap4 = TRUE;
long nDayCount, nSecInDay, nMinInDay;
long nDay4, nYr4, nYear4, nYear400, nCentury400;
long nYear, nMonth, nDay, nHour, nMinute, nSecond;
const int lpMDay[13] =
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
if(dbDate > 0.0) dbTime = dbDate;
else dbTime = 0.0 - dbDate;
dbTime += 0.0000057870370;
nDayCount = (long)dbTime;
nSecInDay = (long)((dbTime - nDayCount) * 86400.0);
nDayCount = nDayCount + 693959;
nYear400 = nDayCount / 146097L;
nDayCount = nDayCount % 146097L;
nCentury400 = (nDayCount - 1) / 36524L;
if(nCentury400 > 0)
{
nDayCount = (nDayCount - 1) % 36524L;
nYear4 = (nDayCount + 1) / 1461L;
if(nYear4 > 0) nDay4 = nYear4;
else
{
bLeap4 = FALSE;
nDay4 = nDayCount;
}
}
else
{
nYear4 = nDayCount / 1461L;
nDay4 = nDayCount % 1461L;
}
if( bLeap4 )
{
nYr4 = (nDay4 - 1) / 365;
if(nYr4 > 0) nDay4 = (nDay4 - 1) % 365;
}
else
{
nYr4 = nDay4 / 365;
nDay4 = nDay4 % 365;
}
// nYear
nYear = nYear400 * 400 + nCentury400 * 100 + nYear4 * 4 + nYr4;
if(nYr4 == 0 && bLeap4)
{
if(nDay4 == 59)
{
nDay = 29;
nMonth = 2;
goto loop_dotime;
}
if(nDay4 >= 60) nDay4 --;
}
nDay4 ++;
nMonth = (nDay4 >> 5) + 1;
for( ; nDay4 > lpMDay[nMonth]; nMonth ++);
nDay = nDay4 - lpMDay[nMonth - 1];
loop_dotime:
if(nSecInDay == 0)
{
nHour = 0;
nMinute = 0;
nSecond = 0;
}
else
{
nSecond = nSecInDay % 60L;
nMinInDay = nSecInDay / 60L;
nMinute = nMinInDay % 60;
nHour = nMinInDay / 60L;
}
// Format date
sprintf( lpBuffer, "%d-%02d-%02d %02d:%02d:%02d",
nYear, nMonth, nDay, nHour, nMinute, nSecond );
}
void XScanVariant(WORD dbType, LPCTSTR lpSrc, void *lpBuffer)
{
switch( dbType )
{
case DBTYPE_I1: // char
case DBTYPE_UI1: // BYTE
case DBTYPE_I2: // short
sscanf(lpSrc, "%hd", (short *)lpBuffer);
break;
case DBTYPE_UI2: // WORD
sscanf(lpSrc, "%hu", (WORD *)lpBuffer);
break;
case DBTYPE_I4: // long
sscanf(lpSrc, "%ld", (long *)lpBuffer);
break;
case DBTYPE_UI4: // DWORD
sscanf(lpSrc, "%lu", (DWORD *)lpBuffer);
break;
case DBTYPE_I8: // __int64
sscanf(lpSrc, "%I64d", (__int64 *)lpBuffer);
break;
case DBTYPE_UI8: // ULONGLONG
sscanf(lpSrc, "%I64u", (ULONGLONG *)lpBuffer);
break;
case DBTYPE_R4: // float
sscanf(lpSrc, "%f", (float *)lpBuffer);
break;
case DBTYPE_R8: // double
sscanf(lpSrc, "%lf", (double *)lpBuffer);
break;
case DBTYPE_BOOL: // VARIANT_BOOL
if(strstr(lpSrc, "TRUE") == NULL)
*((VARIANT_BOOL *)lpBuffer) = VARIANT_FALSE;
else
*((VARIANT_BOOL *)lpBuffer) = VARIANT_TRUE;
break;
case DBTYPE_STR: // string
lstrcpy((LPTSTR)lpBuffer, lpSrc);
break;
case DBTYPE_BSTR:
case DBTYPE_WSTR: // wide string
StrToWStr(lpSrc, (LPWSTR)lpBuffer, 0x04000);
break;
case DBTYPE_CY: // currency
{
double dbValue;
sscanf(lpSrc, "%lf", &dbValue);
*((__int64 *)lpBuffer) = (__int64)(dbValue * 10000);
}
break;
case DBTYPE_DATE: // date
break;
case DBTYPE_DECIMAL: // Decimal
break;
case DBTYPE_NUMERIC: // numeric
break;
case DBTYPE_DBDATE: // DBDATE
break;
case DBTYPE_DBTIME: // DBTIME
break;
case DBTYPE_FILETIME: // FILETIME
break;
case DBTYPE_DBTIMESTAMP: // DBTIMESTAMP
break;
}
}
void XFormatVariant(WORD dbType, void *lpSrc, LPTSTR lpBuffer)
{
switch( dbType )
{
case DBTYPE_I1: // char
sprintf(lpBuffer, "%hd", *((char *)lpSrc));
break;
case DBTYPE_UI1: // BYTE
sprintf(lpBuffer, "%hu", *((BYTE *)lpSrc));
break;
case DBTYPE_I2: // short
sprintf(lpBuffer, "%hd", *((short *)lpSrc));
break;
case DBTYPE_UI2: // WORD
sprintf(lpBuffer, "%hu", *((WORD *)lpSrc));
break;
case DBTYPE_I4: // long
sprintf(lpBuffer, "%ld", *((long *)lpSrc));
break;
case DBTYPE_UI4: // DWORD
sprintf(lpBuffer, "%lu", *((DWORD *)lpSrc));
break;
case DBTYPE_I8: // __int64
sprintf(lpBuffer, "%I64d", *((__int64 *)lpSrc));
break;
case DBTYPE_UI8: // ULONGLONG
sprintf(lpBuffer, "%I64u", *((ULONGLONG *)lpSrc));
break;
case DBTYPE_R4: // float
sprintf(lpBuffer, "%f", *((float *)lpSrc));
break;
case DBTYPE_R8: // double
sprintf(lpBuffer, "%lf", *((double *)lpSrc));
break;
case DBTYPE_BOOL: // VARIANT_BOOL
if( *((VARIANT_BOOL *)lpSrc) )
lstrcpy(lpBuffer, "TRUE");
else
lstrcpy(lpBuffer, "FALSE");
break;
case DBTYPE_STR: // string
lstrcpy(lpBuffer, (LPCTSTR)lpSrc);
break;
case DBTYPE_BSTR:
case DBTYPE_WSTR: // wide string
WStrToStr((LPWSTR)lpSrc, lpBuffer, 0x04000);
break;
case DBTYPE_CY: // currency
{
__int64 nCur = *((__int64 *)lpSrc);
sprintf(lpBuffer, "%d.%04d", nCur / 10000, nCur % 10000);
}
break;
case DBTYPE_DATE: // date
XFormatOleDate(*((double *)lpSrc), lpBuffer);
break;
case DBTYPE_DECIMAL: // Decimal
break;
case DBTYPE_NUMERIC: // numeric
break;
case DBTYPE_DBDATE: // DBDATE
break;
case DBTYPE_DBTIME: // DBTIME
break;
case DBTYPE_FILETIME: // FILETIME
break;
case DBTYPE_DBTIMESTAMP: // DBTIMESTAMP
{
DBTIMESTAMP *lpTime = (DBTIMESTAMP *)lpSrc;
sprintf( lpBuffer, "%d-%02d-%02d %02d:%02d:%02d",
lpTime->year, lpTime->month, lpTime->day,
lpTime->hour, lpTime->minute, lpTime->second );
}
break;
case DBTYPE_EMPTY:
lstrcpy(lpBuffer, "-EMPTY-");
break;
case DBTYPE_NULL:
lstrcpy(lpBuffer, "-NULL-");
break;
default:
lstrcpy(lpBuffer, "-Unknown-");
break;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -