⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xolestrvariant.cpp

📁 数据库访问原代码
💻 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 + -