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

📄 sqlcesvr.cpp

📁 对ce sqlsvr的一系列操作
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	// [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 + -