📄 xoledatabase.cpp
字号:
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 + -