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

📄 xoledatabase.cpp

📁 通过oledb
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	int  nIdx = 0;

	while(nIdx < m_nColumnCount)
	{
		if(lstrcmpi(m_lpColumnInfo[nIdx].lpName, 
			  strName) == 0)  return nIdx;
		nIdx ++;
	}

	return -1;
}

int  XOleRowset::GetColumnValue(int nIdx, void * lpBuffer)
{
	if(nIdx >= 0 && nIdx < m_nColumnCount)
	{
		memcpy( lpBuffer, m_lpBuffer + 
			m_lpColumnInfo[nIdx].dwOffset, 
			m_lpColumnInfo[nIdx].dwSize );

		return m_lpColumnInfo[nIdx].dwSize;
	}

	return -1;
}

int XOleRowset::SetColumnValue(int nIdx, void * lpBuffer, int nSize)
{
	if(nIdx >= 0 && nIdx < m_nColumnCount)
	{
		if(nSize > (int)m_lpColumnInfo[nIdx].dwSize)
			nSize = m_lpColumnInfo[nIdx].dwSize;

		memcpy(m_lpBuffer + m_lpColumnInfo[nIdx].dwOffset, 
			   lpBuffer, nSize);

		return  nSize;
	}

	return -1;
}

void XOleRowset::GetColumnString(int nIdx, LPTSTR lpBuffer)
{
	if(nIdx >= 0 && nIdx < m_nColumnCount)
	{
		XFormatOleVariant( m_lpColumnInfo[nIdx].wdType, 
			m_lpBuffer + m_lpColumnInfo[nIdx].dwOffset, 
			lpBuffer, m_lpColumnInfo[nIdx].dwSize );
	}
}

void XOleRowset::SetColumnString(int nIdx, LPCTSTR lpBuffer)
{
	if(nIdx >= 0 && nIdx < m_nColumnCount)
	{
		XScanOleVariant( m_lpColumnInfo[nIdx].wdType, 
			lpBuffer, m_lpBuffer + m_lpColumnInfo[nIdx].dwOffset, 
			m_lpColumnInfo[nIdx].dwSize );
	}
}

void XOleRowset::FillStruct(void * lpStruct, const int * lpSize)
{
	DWORD   nIdx = 0;
	LPBYTE  lpExport = (LPBYTE)lpStruct;

	for(int i = 0; i < m_nColumnCount; i ++)
	{
		switch( m_lpColumnInfo[i].wdType ) 
		{
		case DBTYPE_STR: 
			StrToTStr( (char *)(m_lpBuffer + m_lpColumnInfo[i].dwOffset), 
					(TCHAR *)(lpExport + nIdx), lpSize[i] );
			break;
		case DBTYPE_WSTR: 
		case DBTYPE_BSTR: 
			WStrToTStr( (WCHAR *)(m_lpBuffer + m_lpColumnInfo[i].dwOffset), 
					(TCHAR *)(lpExport + nIdx), lpSize[i] );
			break;
		default: 
			memcpy( lpExport + nIdx, 
					m_lpBuffer + m_lpColumnInfo[i].dwOffset, 
					lpSize[i] );
		}

		nIdx += lpSize[i];
	}
}

void XOleRowset::LoadStruct(void * lpStruct, const int * lpSize)
{
	DWORD   nIdx = 0;
	LPBYTE  lpImport = (LPBYTE)lpStruct;

	for(int i = 0; i < m_nColumnCount; i ++)
	{
		switch( m_lpColumnInfo[i].wdType ) 
		{
		case DBTYPE_STR: 
			TStrToStr( (TCHAR *)(lpImport + nIdx), 
				(char *)(m_lpBuffer + m_lpColumnInfo[i].dwOffset), 
				m_lpColumnInfo[i].dwSize );
			break;
		case DBTYPE_WSTR: 
		case DBTYPE_BSTR: 
			TStrToWStr( (TCHAR *)(lpImport + nIdx), 
				(WCHAR *)(m_lpBuffer + m_lpColumnInfo[i].dwOffset), 
				m_lpColumnInfo[i].dwSize );
			break;
		default: 
			memcpy( m_lpBuffer + m_lpColumnInfo[i].dwOffset, 
					lpImport + nIdx, m_lpColumnInfo[i].dwSize );
		}

		nIdx += lpSize[i];
	}
}


/*******************************************/
/* * * *     几个全局字符串函数      * * * */
/*******************************************/

LPCSTR   XTrimStr(LPSTR lpBuffer, long nMaxSize)
{
	long  nLength = lstrlenA(lpBuffer);
	if(nLength > nMaxSize)  
	{
		nLength = nMaxSize - 1;
		lpBuffer[nLength] = 0x00;
	}

	while(nLength > 0)
	{
		nLength --;
		if(lpBuffer[nLength] == 0x20)
			lpBuffer[nLength] = 0x00;
		else  break;
	}

	return lpBuffer;
}

LPCWSTR  XTrimWStr(LPWSTR lpBuffer, long nMaxSize)
{
	long  nLength = lstrlenW(lpBuffer);
	nMaxSize = nMaxSize >> 1;
	if(nLength > nMaxSize)
	{
		nLength = nMaxSize - 1;
		lpBuffer[nLength] = 0x0000;
	}

	while(nLength > 0)
	{
		nLength --;
		if(lpBuffer[nLength] == 0x20)
			lpBuffer[nLength] = 0x00;
		else  break;
	}

	return lpBuffer;
}

void  BinaryToTStr(LPVOID lpSrc, LPTSTR lpDest, DWORD dwSize)
{
	DWORD   i, k = 0;
	unsigned char  xnByte;
	LPBYTE  lpByte = (LPBYTE)lpSrc;

	for(i = 0; i < dwSize; i ++)
	{
		// 高四位
		xnByte = (lpByte[i] >> 4);
		if(xnByte > 0x09)  xnByte += 0x37;
		else               xnByte += 0x30;
		lpDest[k ++] = xnByte;

		// 低四位
		xnByte = (lpByte[i] & 0x0f);
		if(xnByte > 0x09)  xnByte += 0x37;
		else               xnByte += 0x30;
		lpDest[k ++] = xnByte;
	}

	// 使字符串结束
	lpDest[k] = 0x00;
}


void  TStrToBinary(LPCTSTR lpSrc, LPVOID lpDest, DWORD dwSize)
{
	DWORD   i, k = 0;
	unsigned char  xnByte, xcChar;
	LPBYTE  lpByte = (LPBYTE)lpSrc;

	for(i = 0; i < dwSize; i ++)
	{
		// 高四位
		if(lpSrc[k] == 0x00)  break;

		xcChar = lpSrc[k ++] - 0x30;
		if(xcChar > 0x09)  xcChar -= 0x07;
		if(xcChar > 0x09)  xcChar -= 0x20;

		// 低四位
		if(lpSrc[k] == 0x00)  break;

		xnByte = lpSrc[k ++] - 0x30;
		if(xnByte > 0x09)  xnByte -= 0x07;
		if(xnByte > 0x09)  xnByte -= 0x20;

		// 设置值
		lpByte[i] = (xcChar << 4) + xnByte;
	}
}

// 大数乘 16 加上某数
void  Hex_LargeNumber(BYTE lpTemp[40], BYTE nNumber) 
{
	for(int i = 0; i < 40; i ++)
	{
		// 每位乘上 16		
		lpTemp[i] = (lpTemp[i] << 4);
	}

	// 加上某个数
	lpTemp[0] += nNumber;

	// 调整为合理的整数
	for(i = 0; i < 40; i ++)
	{
		lpTemp[i + 1] += (lpTemp[i] / 0x0a);
		lpTemp[i] = (lpTemp[i] % 0x0a);
	}
}

// Numeric 进行格式化
void  NumericToString(DB_NUMERIC * lpNumber, LPTSTR lpBuffer)
{
	// 字符缓冲区
	int   i, k;
	BYTE  lpTemp[40];

	// 全部清为零
	memset(lpTemp, 0x00, 40);

	// 每 4 位一组
	for(k = 15; k >= 0; k --)
	{
		// 累加高位
		Hex_LargeNumber(lpTemp, lpNumber->val[k] >> 4);

		// 累加低位
		Hex_LargeNumber(lpTemp, lpNumber->val[k] & 0x0f);
	}

	// 统计数字个数
	int  nCount = 0;
	int  nScale = lpNumber->scale;

	for(i = 40; i > 0; i --)
	{
		if(lpTemp[i - 1] > 0x00)
		{
			nCount = i;
			break;
		}
	}

	if(nCount <= nScale)
	{
		// 小数点前有一位零
		nCount = nScale + 1;
	}

	// 输出数据
	int  nIdx = 0;

	// 负数与否
	if(lpNumber->sign == 0x00)
	{
		lpBuffer[0] = '-';
		nIdx = 1;
	}

	// 整数部分
	for(i = nCount - 1; i >= nScale; i --)
	{
		lpBuffer[nIdx] = lpTemp[i] + 0x30;
		nIdx ++;
	}

	// 小数部分
	if(nScale > 0x00)
	{
		// 小数点位
		lpBuffer[nIdx ++] = '.';

		// 后面的数字
		for(i = nScale - 1; i >= 0; i --)
		{
			lpBuffer[nIdx] = lpTemp[i] + 0x30;
			nIdx ++;
		}
	}

	// 字符串结束
	lpBuffer[nIdx] = 0x00;
}

// 大数乘 10 加上 某数
void  Dec_LargeNumber(BYTE lpTemp[40], BYTE nNumber)
{
	// 所有的位乘十
	for(int i = 0; i < 32; i ++)
	{
		lpTemp[i] = (lpTemp[i] * 10);
	}

	// 加上一个数值
	lpTemp[0] += nNumber;

	// 调整为合理的数
	for(i = 0; i < 32; i ++)
	{
		lpTemp[i + 1] += (lpTemp[i] / 0x10);
		lpTemp[i] = (lpTemp[i] & 0x0f);
	}
}

// 字符串转换为 Numeric
void  StringToNumeric(LPCTSTR lpBuffer, DB_NUMERIC * lpNumber)
{
	int  i, k, nIdx = 0;

	// 首先是符号
	if(lpBuffer[0] == '-')
	{
		lpNumber->sign = 0x01;
		nIdx ++;
	}

	// 扩展为32个数字
	BYTE  lpTemp[40];
	memset(lpTemp, 0x00, 40);

	// 累计数据的值
	BOOL  bNumPoint = FALSE;
	int   nScale = lpNumber->scale;

	while(lpBuffer[nIdx] != 0x00)
	{
		// 字符是数字
		if(lpBuffer[nIdx] > 0x2f && lpBuffer[nIdx] < 0x3a)
		{
			if( bNumPoint )
			{
				if(nScale == 0)  break;
				nScale --;
			}

			// 累计数据
			Dec_LargeNumber(lpTemp, lpBuffer[nIdx] - 0x30);
		}
		else if(lpBuffer[nIdx] == '.')
		{
			// 已经有小数点
			if( bNumPoint )  break;
			bNumPoint = TRUE;
		}
		else  break;

		// 下一个字符
		nIdx ++;
	}

	// 还需要向后累计
	for(i = 0; i < nScale; i ++)
	{
		// 累计数据
		Dec_LargeNumber(lpTemp, 0x00);
	}

	// 转换为真实数据
	BYTE  * lpData = lpNumber->val;
	memset(lpData, 0x00, 16);

	for(i = 0, k = 0; i < 32; i += 2, k ++)
	{
		lpData[k] = (lpTemp[i + 1] << 4) | lpTemp[i];
	}
}

// 格式化字段的值
void  XFormatOleVariant(WORD wdType, LPVOID lpSrc, LPTSTR lpBuffer, DWORD dwSize)
{
	switch( wdType )
	{
	case DBTYPE_I2:      // short
		XSprintf(lpBuffer, T("%hd"), *(short *)lpSrc);
		break;
	case DBTYPE_UI2:     // WORD
		XSprintf(lpBuffer, T("%hu"), *(WORD *)lpSrc);
		break;
	case DBTYPE_I4:      // long
		XSprintf(lpBuffer, T("%ld"), *(long *)lpSrc);
		break;
	case DBTYPE_UI4:     // DWORD
		XSprintf(lpBuffer, T("%lu"), *(DWORD *)lpSrc);
		break;
	case DBTYPE_I8:      // __int64
		XSprintf(lpBuffer, T("%I64d"), *(LONGLONG *)lpSrc);
		break;
	case DBTYPE_UI8:     // ULONGLONG
		XSprintf(lpBuffer, T("%I64u"), *(ULONGLONG *)lpSrc);
		break;
	case DBTYPE_R4:      // float
		XSprintf(lpBuffer, T("%f"), *(float *)lpSrc);
		break;
	case DBTYPE_R8:      // double
		XSprintf(lpBuffer, T("%lf"), *(double *)lpSrc);
		break;
	case DBTYPE_NUMERIC: 
		NumericToString((DB_NUMERIC *)lpSrc, lpBuffer);
		break;
	case DBTYPE_BOOL:    // VARIANT_BOOL
		if( *(VARIANT_BOOL *)lpSrc )
			lstrcpy(lpBuffer, T("TRUE"));
		else
			lstrcpy(lpBuffer, T("FALSE"));
		break;
	case DBTYPE_STR:     // string
		StrToTStr((LPSTR)lpSrc, lpBuffer, dwSize);
		break;
	case DBTYPE_BSTR: 
	case DBTYPE_WSTR:    // wide string
		WStrToTStr((LPCWSTR)lpSrc, lpBuffer, dwSize >> 1);
		break;
	case DBTYPE_BYTES:   // Binary
		BinaryToTStr(lpSrc, lpBuffer, dwSize);
		break;
	case DBTYPE_CY:      // currency
		{
			LONGLONG  nCur = *(__int64 *)lpSrc;
			XSprintf(lpBuffer, T("%d.%04d"), nCur / 10000, nCur % 10000);
		}
		break;
	case DBTYPE_DBTIMESTAMP: // DBTIMESTAMP
		{
			DBTIMESTAMP  *lpTime = (DBTIMESTAMP *)lpSrc;
			XSprintf( lpBuffer, T("%d-%02d-%02d %02d:%02d:%02d"), 
					 lpTime->year, lpTime->month, lpTime->day, 
					 lpTime->hour, lpTime->minute, lpTime->second );
		}
		break;
	default : 
		lstrcpy(lpBuffer, T("---UnKnown---")); 
	}
}

void  XScanOleVariant(WORD wdType, LPCTSTR lpBuffer, LPVOID lpDest, DWORD dwSize)
{
	switch( wdType )
	{
	case DBTYPE_I2:      // short
		XScanf(lpBuffer, T("%hd"), (short *)lpDest);
		break;
	case DBTYPE_UI2:     // WORD
		XScanf(lpBuffer, T("%hu"), (WORD *)lpDest);
		break;
	case DBTYPE_I4:      // long
		XScanf(lpBuffer, T("%ld"), (long *)lpDest);
		break;
	case DBTYPE_UI4:     // DWORD
		XScanf(lpBuffer, T("%lu"), (DWORD *)lpDest);
		break;
	case DBTYPE_I8:      // __int64
		XScanf(lpBuffer, T("%I64d"), (LONGLONG *)lpDest);
		break;
	case DBTYPE_UI8:     // ULONGLONG
		XScanf(lpBuffer, T("%I64u"), (ULONGLONG *)lpDest);
		break;
	case DBTYPE_R4:      // float
		XScanf(lpBuffer, T("%f"), (float *)lpDest);
		break;
	case DBTYPE_R8:      // double
		XScanf(lpBuffer, T("%lf"), (double *)lpDest);
		break;
	case DBTYPE_NUMERIC: 
		StringToNumeric(lpBuffer, (DB_NUMERIC *)lpDest);
		break;
	case DBTYPE_BOOL:    // VARIANT_BOOL
		if(lstrcmpi(lpBuffer, T("TRUE")) == 0)
			*((VARIANT_BOOL *)lpDest) = VARIANT_TRUE;
		else 
			*((VARIANT_BOOL *)lpDest) = VARIANT_FALSE;
		break;
	case DBTYPE_STR:     // string
		TStrToStr(lpBuffer, (LPSTR)lpDest, dwSize);
		break;
	case DBTYPE_BSTR: 
	case DBTYPE_WSTR:    // wide string
		TStrToWStr(lpBuffer, (LPWSTR)lpDest, dwSize >> 1);
		break;
	case DBTYPE_BYTES:   // Binary
		memset(lpDest, 0x00, dwSize);
		TStrToBinary(lpBuffer, lpDest, dwSize);
		break;
	case DBTYPE_CY:      // currency
		{
			long  nCent = 0;   LONGLONG  nCurr = 0;
			XScanf(lpBuffer, T("%I64d.%04d"), &nCurr, &nCent);
			*(__int64 *)lpDest = nCurr * 10000 + nCent;
		}
		break;
	case DBTYPE_DBTIMESTAMP: // DBTIMESTAMP
		{
			DBTIMESTAMP  *lpTime = (DBTIMESTAMP *)lpDest;
			XScanf( lpBuffer, T("%hd-%hd-%hd %hd:%hd:%hd"), 
					&lpTime->year, &lpTime->month, &lpTime->day, 
					&lpTime->hour, &lpTime->minute, &lpTime->second );
			lpTime->fraction = 0;
		}
		break;
	default : 
		// 必须支持
		memset(lpDest, 0x00, dwSize);
	}
}

// 通过系统选择数据源
XDB_EXT  BOOL XSelectDataSource(HWND hWnd, LPTSTR lpConnect)
{
	HRESULT  hr;
	XComPtr<IDBInitialize>    dbInit;
	XComPtr<IDBProperties>    dbPropert;
	XComPtr<IDataInitialize>  dbDataInit;
	XComPtr<IDBPromptInitialize>  dbPrompt; 
	
	hr = CoCreateInstance( 
				CLSID_DataLinks, NULL, 
				CLSCTX_INPROC_SERVER,
				IID_IDBPromptInitialize, 
				(void **) &dbPrompt
			);
	if(hr != S_OK)   return FALSE;

	hr = dbPrompt->PromptDataSource( NULL, hWnd, 
				DBPROMPTOPTIONS_WIZARDSHEET, 0, NULL, NULL, 
				IID_IDBProperties, (IUnknown **) &dbPropert);
	if(hr != S_OK)  return FALSE;

	hr = dbPropert.QueryInterface(
		   IID_IDBInitialize, &dbInit);
	if(hr != S_OK)  return FALSE;

	hr = dbInit->Initialize();
	if(hr != S_OK)  return FALSE;

	hr = CoCreateInstance( CLSID_MSDAINITIALIZE, NULL, 
						   CLSCTX_INPROC_SERVER, 
						   IID_IDataInitialize,
						   (void **) &dbDataInit);
	if(hr != S_OK)   return hr;

	// Get connect string
	LPOLESTR   szInitStr;
	hr = dbDataInit->GetInitializationString( 
			dbInit, TRUE, &szInitStr);
	if(hr == S_OK)
	{
		WStrToTStr(szInitStr, lpConnect, 4096); 
		CoTaskMemFree(szInitStr);
		return TRUE;
	}

	CoTaskMemFree(szInitStr);
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -