📄 sqlcesvr.cpp
字号:
// [REMOVABLE CODE - START]
if (lTotalCols > 0)
{
// Clear all the previous listview item
SendMessage(hWndList1, LVM_DELETEALLITEMS, 0, 0);
// Clear the previous column header
for (idx=0; idx<lTotalCols; idx++)
{
SendMessage(hWndList1, LVM_DELETECOLUMN, (int)0, 0);
};
}
// Setup column names.
for(lCount=0; lCount<lNumCols; lCount++)
{
// Initialize listview column structure
pcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
pcol.fmt = LVCFMT_LEFT;
pcol.pszText = pDBColumnInfo[lCount].pwszName;
//pcol.cx = 80;
pcol.cx = SendMessage(hWndList1, LVM_GETSTRINGWIDTH, 0, (LPARAM)pDBColumnInfo[lCount].pwszName) + 16;
// Append listview column
SendMessage(hWndList1, LVM_INSERTCOLUMN, lCount, (LPARAM)&pcol);
};
//
lTotalCols = lNumCols;
// [REMOVABLE CODE - END]
// Get a set of 10 rows.
pIRowset->GetNextRows(NULL,
0,
10,
&lNumRowsRetrieved,
&pRows);
// Allocate space for the row buffer.
pBuffer = new BYTE[ConsumerBufColOffset];
// Display the rows.
while(lNumRowsRetrieved > 0)
{
//For each row, print the column data.
for(lCount=0; lCount<lNumRowsRetrieved; lCount++)
{
// Initialize...
memset(pBuffer, 0, ConsumerBufColOffset);
// Get the row data values.
pIRowset->GetData(hRows[lCount], hAccessor, pBuffer);
/*TCHAR *temp;
temp=new TCHAR[2000];
temp=(TCHAR*)pBuffer;
MessageBox(NULL,temp,temp,MB_OK);*/
// -- Item
pitem.mask = LVIF_TEXT;
pitem.iItem = SendMessage(hWndList1, LVM_GETITEMCOUNT, 0, 0);
pitem.pszText = (LPTSTR)&pBuffer[pBindings[0].obValue];
pitem.iSubItem = 0;
// Insert item
idx = SendMessage(hWndList1, LVM_INSERTITEM, 0, (LPARAM)&pitem);
// Walk through each columns...
for (lColumn=1; lColumn<lNumCols; lColumn++)
{
pitem.mask = LVIF_TEXT;
pitem.iItem = idx;
pitem.pszText = (LPTSTR)&pBuffer[pBindings[lColumn].obValue];
pitem.iSubItem = lColumn;
// Insert subitem
//TCHAR temp[100];
//wsprintf(temp,_T("obValue=%d\0"),pBindings[lColumn].obValue);
//wsprintf(temp,_T("%d\0"),ConsumerBufColOffset);
//MessageBox(NULL,temp,temp,MB_OK);
//MessageBox(NULL,pitem.pszText,pitem.pszText,MB_OK);
SendMessage(hWndList1, LVM_SETITEM, 0, (LPARAM)&pitem);
}
// Update the total column counter by 1
lTotalRows++;
};
// Release the rows retrieved.
pIRowset->ReleaseRows(lNumRowsRetrieved,
hRows,
NULL,
NULL,
NULL);
// Get the next set of 10 rows.
pIRowset->GetNextRows(NULL,
0,
10,
&lNumRowsRetrieved,
&pRows);
};
{
// Get the complete time (CPU Tick)
t2 = GetTickCount();
// Calculate the total time
elapse = (t2 - t1)/1000;
iHour = elapse/3600;
iMinute = (elapse/60) - (iHour*60);
iSecond = elapse - (iHour*3600) - (iMinute*60);
iMiliSec = (t2-t1) - (elapse*1000);
// Initialize...
memset(szBuffer, TEXT('\0'), 1024);
// Compose...
wsprintf(szBuffer, TEXT("\r\n(%ld row(s) affected)\r\nElapsed time %02d:%02d:%02d.%03d"), lTotalRows, iHour, iMinute, iSecond, iMiliSec);
// Update Mesasge display
//UpdateList(szBuffer);
}
// Set return value
hr = S_OK;
CleanExit:
if (NULL != pIColumnsInfo)
{
pIColumnsInfo->Release();
pIColumnsInfo = NULL;
}
if (NULL != pBindings)
{
delete [] pBindings;
pBindings = NULL;
}
if (NULL != pIAccessor)
{
pIAccessor->Release();
pIAccessor = NULL;
}
/*
if (NULL != pBuffer)
{
delete [] pBuffer;
pBuffer = NULL;
}
*/
return hr;
}
extern "C" SQLCESVR_API HRESULT ProcessRowsetEx (IRowset *pIRowset,HWND hWndList1,int iskip)
{
LVITEM pitem;
long idx=0;
long lTotalRows = 0;
static long lTotalCols = 0;
long t1=0;
long t2=0;
long elapse=0;
HRESULT hr = NOERROR;
ULONG lColumn = 0;
ULONG lNumCols = 0;
ULONG lCount = 0;
ULONG lNumRowsRetrieved = 0;
ULONG ConsumerBufColOffset = 0;
IAccessor *pIAccessor = NULL;
IColumnsInfo *pIColumnsInfo = NULL;
DBCOLUMNINFO *pDBColumnInfo = NULL;
DBBINDING *pBindings = NULL;
HACCESSOR hAccessor = NULL;
HROW hRows[10];
HROW *pRows = &hRows[0];
BYTE *pBuffer = NULL;
WCHAR *pStringsBuffer = NULL;
hr = pIRowset->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo);
if(FAILED(hr))
{
goto CleanExit;
}
pIColumnsInfo->GetColumnInfo(&lNumCols,
&pDBColumnInfo,
&pStringsBuffer);
pIColumnsInfo->Release();
pBindings = new DBBINDING[lNumCols];
for(lCount=0; lCount<lNumCols; lCount++)
{
pBindings[lCount].iOrdinal = lCount+1;
pBindings[lCount].obValue = ConsumerBufColOffset;
pBindings[lCount].pTypeInfo = NULL;
pBindings[lCount].pObject = NULL;
pBindings[lCount].pBindExt = NULL;
pBindings[lCount].dwPart = DBPART_VALUE;
pBindings[lCount].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
pBindings[lCount].eParamIO = DBPARAMIO_NOTPARAM;
pBindings[lCount].cbMaxLen = 400;//48;//pColumnsInfo[nCol].ulColumnSize
pBindings[lCount].dwFlags = 0;
pBindings[lCount].wType = DBTYPE_WSTR;
pBindings[lCount].bPrecision = pDBColumnInfo[lCount].bPrecision;
pBindings[lCount].bScale = pDBColumnInfo[lCount].bScale;
ConsumerBufColOffset += 400; //pDBColumnInfo[lCount].ulColumnSize;
//ConsumerBufColOffset += pDBColumnInfo[lCount].ulColumnSize;
};
hr = pIRowset->QueryInterface(IID_IAccessor,
(void **)&pIAccessor);
if(FAILED(hr))
{
goto CleanExit;
}
pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
lNumCols,
pBindings,
0,
&hAccessor,
NULL);
lTotalCols = lNumCols;
pIRowset->GetNextRows(NULL,
0,
NUMROWS_CHUNK,
&lNumRowsRetrieved,
&pRows);
pBuffer = new BYTE[ConsumerBufColOffset];
while(lNumRowsRetrieved > 0)
{
for(lCount=0; lCount<lNumRowsRetrieved; lCount++)
{
//if(lCount % 10 ==0)
if(lCount % iskip ==0)
{
memset(pBuffer, 0, ConsumerBufColOffset);
pIRowset->GetData(hRows[lCount], hAccessor, pBuffer);
pitem.mask = LVIF_TEXT;
pitem.iItem = SendMessage(hWndList1, LVM_GETITEMCOUNT, 0, 0);
TCHAR szRowString[2048];
memset(szRowString, _T('\0'), 2048);
/*wsprintf(szRowString,_T("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\0"),
(LPTSTR)&pBuffer[pBindings[0].obValue],(LPTSTR)&pBuffer[pBindings[1].obValue],
(LPTSTR)&pBuffer[pBindings[2].obValue],(LPTSTR)&pBuffer[pBindings[3].obValue],
(LPTSTR)&pBuffer[pBindings[4].obValue],(LPTSTR)&pBuffer[pBindings[5].obValue],
(LPTSTR)&pBuffer[pBindings[6].obValue],(LPTSTR)&pBuffer[pBindings[7].obValue],
(LPTSTR)&pBuffer[pBindings[8].obValue],(LPTSTR)&pBuffer[pBindings[9].obValue],
(LPTSTR)&pBuffer[pBindings[10].obValue],(LPTSTR)&pBuffer[pBindings[10].obValue],
(LPTSTR)&pBuffer[pBindings[12].obValue],(LPTSTR)&pBuffer[pBindings[13].obValue]);*/
wsprintf(szRowString,_T("%s,%s,%s,%s,%s,%s,%s,%s\0"),
(LPTSTR)&pBuffer[pBindings[0].obValue],(LPTSTR)&pBuffer[pBindings[1].obValue],
(LPTSTR)&pBuffer[pBindings[2].obValue],(LPTSTR)&pBuffer[pBindings[3].obValue],
(LPTSTR)&pBuffer[pBindings[4].obValue],(LPTSTR)&pBuffer[pBindings[5].obValue],
(LPTSTR)&pBuffer[pBindings[6].obValue],(LPTSTR)&pBuffer[pBindings[7].obValue]);
//::MessageBox(NULL,szRowString,szRowString,MB_OK);
pitem.pszText = szRowString;
pitem.iSubItem = 0;
idx = SendMessage(hWndList1, LVM_INSERTITEM, 0, (LPARAM)&pitem);
}
};
pIRowset->ReleaseRows(lNumRowsRetrieved, hRows,NULL,NULL, NULL);
pIRowset->GetNextRows(NULL,0,NUMROWS_CHUNK,&lNumRowsRetrieved,&pRows);
};
hr = S_OK;
CleanExit:
if (NULL != pIColumnsInfo)
{
pIColumnsInfo->Release();
pIColumnsInfo = NULL;
}
if (NULL != pBindings)
{
delete [] pBindings;
pBindings = NULL;
}
if (NULL != pIAccessor)
{
pIAccessor->Release();
pIAccessor = NULL;
}
return hr;
}
extern "C" SQLCESVR_API
HRESULT GetErrorMessage (LPTSTR lpszBuffer, int MaxBuffer)
{
// PURPOSE:
// - Get the current error message
// PARAMETERS:
// - lpszOleDBErrMessage :: Error message string buffer
// OPERATION:
// - ...
// RETURN VALUE:
// - HRESULT
DWORD dwErrorIndex = 0;
ULONG ulNumErrorRecs = 0;
HRESULT hr = NOERROR;
IErrorInfo *pIErrorInfo;
IErrorInfo *pIErrorInfoRecord;
IErrorRecords *pIErrorRecords;
ERRORINFO ErrorInfo;
// This interface supports returning error information
// Get the error object from the system for this thread
hr = GetErrorInfo(0, &pIErrorInfo);
// Validation
if(FAILED(hr) || NULL == pIErrorInfo)
return hr;
hr = pIErrorInfo->QueryInterface(IID_IErrorRecords, (void **) &pIErrorRecords);
// Validation
if(FAILED(hr) || NULL == pIErrorInfo)
return hr;
// Release unneeded interface
pIErrorInfo->Release();
// Determine the number of records in this error object
hr = pIErrorRecords->GetRecordCount(&ulNumErrorRecs);
// Validation
if(FAILED(hr) || NULL == pIErrorInfo)
return hr;
// Loop over each error record in the error object to display information
// about each error. Errors are returned
for (dwErrorIndex = 0; dwErrorIndex < ulNumErrorRecs; dwErrorIndex++)
{
// Attempt to retrieve basic error information for this error.
hr = pIErrorRecords->GetBasicErrorInfo(dwErrorIndex, &ErrorInfo);
// Retrieve standard error information for this error
hr = pIErrorRecords->GetErrorInfo(dwErrorIndex, NULL, &pIErrorInfoRecord);
// Allocate string buffer
BSTR bstrDescriptionOfError = NULL;
BSTR bstrSourceOfError = NULL;
// Get error description
hr = pIErrorInfoRecord->GetDescription(&bstrDescriptionOfError);
// Get error source
hr = pIErrorInfoRecord->GetSource(&bstrSourceOfError);
if(NULL != pIErrorInfoRecord)
// Release unneeded interface
pIErrorInfoRecord->Release();
// Initialize...
memset(lpszBuffer, TEXT('\0'), MaxBuffer);
// At this point, you could call GetCustomErrorObject
// and query for additional interfaces to determine
// what else happened.
wsprintf(lpszBuffer,
TEXT("Error Code: 0x%lx\r\n %s."),
ErrorInfo.hrError,
bstrDescriptionOfError);
// Free the resources.
SysFreeString(bstrDescriptionOfError);
SysFreeString(bstrSourceOfError);
}
// Release unneeded interface
pIErrorRecords->Release();
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -