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

📄 oledbrecordset.cpp

📁 oledb封装类仿MFC的CRecordset
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	ICommandProperties* pICommandProperties=NULL;
	ICommandText* pICommandText=NULL;
	IRowset* pRowset=NULL;
	IAccessor* pAccessor=NULL;
	HACCESSOR hAccessor=NULL;
	IRowsetChange* pIRowsetChange=NULL;
	long nRowsCount=0;
	HRESULT hr;
	m_pDatabase->m_pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession);
	hr=pIDBCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pIDBCreateCommand);
	pIDBCreateSession->Release();
	if (FAILED(hr))
	{
		ATLTRACE(L"IDBCreateSession Interface Call CreateSession Method Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	hr=pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,(IUnknown**)&pICommand);
	pIDBCreateCommand->Release();
	if(FAILED(hr))
	{
		ATLTRACE(L"IDBCreateCommand Interface Call CreateCommand Method Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	pICommand->QueryInterface(IID_ICommandProperties,(void**)&pICommandProperties);
	m_rgCmdPropSet[0].cProperties=20;
	m_rgCmdPropSet[0].rgProperties[0].vValue.boolVal=VARIANT_FALSE;
	hr=pICommandProperties->SetProperties(1,m_rgCmdPropSet);
	pICommandProperties->Release();
	if(FAILED(hr))
	{
		ATLTRACE(L"ICommandProperties Interface Call SetProperties Method Failed,Result code is %08X\n",hr);
		pICommand->Release();
		return FALSE;
	}
	pICommand->QueryInterface(IID_ICommandText,(void**)&pICommandText);
	if(pColumnNames)
	{
		size_t nNewHBLen=::wcslen(pColumnNames)+14;
		if(nNewHBLen>m_nHBLen)
		{
			m_nHBLen=nNewHBLen;
			delete[] m_strHalfSQLStatement;
			m_strHalfSQLStatement=new WCHAR[m_nHBLen];
		}
		::wcscpy(m_strHalfSQLStatement,L"SELECT ");
		::wcscat(m_strHalfSQLStatement,pColumnNames);
		::wcscat(m_strHalfSQLStatement,L" FROM ");
	}
	size_t nFilterLen=::wcslen(m_strFilter);
	size_t nSortLen=::wcslen(m_strSort);
	size_t nTableLen=::wcslen(m_strTable);
	LPWSTR pwstrSQLStatement=new WCHAR[::wcslen(m_strHalfSQLStatement)+nFilterLen+nTableLen+nSortLen+32];
	::wcscpy(pwstrSQLStatement,m_strHalfSQLStatement);
	::wcscat(pwstrSQLStatement,m_strTable);
	if(nFilterLen)
	{
		::wcscat(pwstrSQLStatement,L" WHERE ");
		::wcscat(pwstrSQLStatement,m_strFilter);
	}
	if(nSortLen)
	{
		::wcscat(pwstrSQLStatement,L" ORDER BY ");
		::wcscat(pwstrSQLStatement,m_strSort);
	}
	hr=pICommandText->SetCommandText(DBGUID_DBSQL,pwstrSQLStatement);
	if(FAILED(hr))
	{
		ATLTRACE(L"ICommandText Interface Call SetCommandText Method Failed,Result code is %08X\n",hr);
		pICommandText->Release();
		pICommand->Release();
		delete[] pwstrSQLStatement;
		return FALSE;
	}
	hr=pICommand->Execute(NULL,IID_IRowset,NULL,&nRowsCount,(IUnknown**)&pRowset);
	pICommandText->Release();
	pICommand->Release();
	if(FAILED(hr))
	{
		ATLTRACE(L"Execute Command Text Failed,Result code is %08X\n",hr);
		delete[] pwstrSQLStatement;
		return FALSE;
	}
	if(pRowset==NULL)
	{
		ATLTRACE(L"Execute Command Text Failed,Result code is %08X\n",hr);
		delete[] pwstrSQLStatement;
		return FALSE;
	}
	m_bHasObject=FALSE;
	if(!InitColumnsBuffer(pRowset))
	{
		pRowset->Release();
		ATLTRACE(L"InitColumnsBuffer Failed");
		delete[] pwstrSQLStatement;
		return FALSE;
	}
	pRowset->QueryInterface(IID_IAccessor,(void**)&pAccessor);
	hr=pAccessor->CreateAccessor(DBACCESSOR_ROWDATA,m_dwColumns,m_pColumnBinding,0, &hAccessor, m_pBindingStatus);
	if(FAILED(hr))
	{
		pAccessor->Release();
		pRowset->Release();
#ifdef _DEBUG
		ATLTRACE(L"IAccessor Interface Call CreateAccessor Method Failed,Result code is %08X\n",hr);
		for(DWORD i=0;i<m_dwColumns;i++)
		{
			ATLTRACE(L"Column %d Binding Status is %x\n",i,m_pBindingStatus[i]);
		}
#endif
		delete[] pwstrSQLStatement;
		return FALSE;
	}
	pRowset->QueryInterface(IID_IRowsetChange,(void**)&pIRowsetChange);
	if(m_pIRowsetChange)
		m_pIRowsetChange->Release();
	if(m_pAccessor)
	{
		m_pAccessor->ReleaseAccessor(m_hAccessor,NULL);
		m_pAccessor->Release();
	}
	if(m_pRowset)
	{
		ReleaseRows();
		m_pRowset->Release();
	}
	m_pRowset=pRowset;
	m_pIRowsetChange=pIRowsetChange;
	m_pAccessor=pAccessor;
	m_hAccessor=hAccessor;
	m_bIsEOF=FALSE;
	MoveFirst();
	m_pDatabase->m_pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession);
	pIDBCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pIDBCreateCommand);
	pIDBCreateSession->Release();
	pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,(IUnknown**)&pICommand);
	pIDBCreateCommand->Release();
	pICommand->QueryInterface(IID_ICommandProperties,(void**)&pICommandProperties);
	m_rgCmdPropSet[0].cProperties=1;
	m_rgCmdPropSet[0].rgProperties[0].vValue.boolVal=VARIANT_TRUE;
	pICommandProperties->SetProperties(1,m_rgCmdPropSet);
	pICommandProperties->Release();
	pICommand->QueryInterface(IID_ICommandText,(void**)&pICommandText);
	pICommandText->SetCommandText(DBGUID_DBSQL,pwstrSQLStatement);
	pICommand->Execute(NULL,IID_IRowset,NULL,&nRowsCount,(IUnknown**)&pRowset);
	pICommandText->Release();
	pICommand->Release();
	pRowset->Release();
	m_nRowsCount=nRowsCount;
	delete[] pwstrSQLStatement;
	return TRUE;
}

void COleDBRecordset::SetColumnInfo(LPCOLESTR pColumnNames, WORD wDBType, LPVOID pColumnValue, LPVOID pColumnLength, DWORD dwPart, DBOBJECT* pObjectStruct, BOOL bReadOnly, DWORD dwMaxLength)
{
	_ASSERT(m_pColumnBinding);
	_ASSERT(m_pColumnInfo);
	for(DWORD i=0;i<m_dwColumns;i++)
	{
		if(::wcscmp(pColumnNames,m_pColumnInfo[i].pwszName)==0)
		{
			m_pColumnBinding[m_dwColumnsCount].iOrdinal=m_pColumnInfo[i].iOrdinal;
		    m_pColumnBinding[m_dwColumnsCount].obValue = DWORD(((LPBYTE)pColumnValue)-m_pRowsBuffer);
			if(pColumnLength)
			    m_pColumnBinding[m_dwColumnsCount].obLength = DWORD(((LPBYTE)pColumnLength)-m_pRowsBuffer);
			if(bReadOnly)
				m_pColumnBinding[m_dwColumnsCount].obStatus = offsetof(COleDBRecordset,m_dwStatusReadonly);
			else
				m_pColumnBinding[m_dwColumnsCount].obStatus = offsetof(COleDBRecordset,m_dwStatusReadWrite);
			m_pColumnBinding[m_dwColumnsCount].pObject = pObjectStruct;
			m_pColumnBinding[m_dwColumnsCount].dwPart = dwPart;
		    m_pColumnBinding[m_dwColumnsCount].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
			m_pColumnBinding[m_dwColumnsCount].eParamIO = DBPARAMIO_NOTPARAM;
			if(dwMaxLength==-1)
				m_pColumnBinding[m_dwColumnsCount].cbMaxLen = m_pColumnInfo[i].ulColumnSize;
			else
				m_pColumnBinding[m_dwColumnsCount].cbMaxLen = dwMaxLength;
			m_pColumnBinding[m_dwColumnsCount].bPrecision = m_pColumnInfo[i].bPrecision;
			m_pColumnBinding[m_dwColumnsCount].bScale = m_pColumnInfo[i].bScale;
			#ifdef _DEBUG
				if(m_pColumnInfo[i].wType!=wDBType&&(!((m_pColumnInfo[i].wType==DBTYPE_BYTES)&&(wDBType==DBTYPE_IUNKNOWN))))
					ATLTRACE(L"Warring: You binding DBType is %d,System required DBType is %d\n",wDBType,m_pColumnInfo[i].wType);
			#endif
			m_pColumnBinding[m_dwColumnsCount].wType = wDBType;
			break;
		}
	}
	m_dwColumnsCount++;
}

BOOL COleDBRecordset::SetAbsolutePosition(long nRow)
{
	_ASSERT(nRow>=0);
	ReleaseRows();
	m_pRowset->RestartPosition(DB_NULL_HCHAPTER);
	m_bIsBOF=TRUE;
	m_bIsEOF=FALSE;
	return Move(nRow);
}

long COleDBRecordset::GetRecordCount(void)
{
	return m_nRowsCount;
}

BOOL COleDBRecordset::InitColumnsBuffer(IRowset* pRowset)
{
	IColumnsInfo* pIColumnsInfo=NULL;
	OLECHAR* pStringBuffer=NULL;
	IMalloc* pIMalloc=NULL;
	DWORD dwColumnsNumber=0;
	HRESULT hr;
	pRowset->QueryInterface(IID_IColumnsInfo,(void**)&pIColumnsInfo);
	hr=pIColumnsInfo->GetColumnInfo(&dwColumnsNumber,&m_pColumnInfo,&pStringBuffer);
	pIColumnsInfo->Release();
	if(dwColumnsNumber>m_dwColumns)
	{
		if(m_pColumnBinding)
			delete[] m_pColumnBinding;
		m_pColumnBinding=new DBBINDING[dwColumnsNumber];

		if(m_pBindingStatus)
			delete[] m_pBindingStatus;
		m_pBindingStatus=new DBBINDSTATUS[dwColumnsNumber];
	}
	memset(m_pColumnBinding,0,sizeof(DBBINDING)*dwColumnsNumber);
	m_dwColumns=dwColumnsNumber;
	m_dwColumnsCount=0;
	BindColumns();
	::CoGetMalloc(1,&pIMalloc);
	pIMalloc->Free(m_pColumnInfo);
	pIMalloc->Free(pStringBuffer);
	pIMalloc->Release();
	return TRUE;
}

void COleDBRecordset::ReleaseRows(void)
{
	if (m_hRow)
	{
		m_pRowset->ReleaseRows(1, &m_hRow, NULL, NULL, NULL);
		m_hRow=NULL;
	}
}

BOOL COleDBRecordset::GetData(void)
{
	HRESULT hr;
	hr=m_pRowset->GetData(m_hRow,m_hAccessor,m_pRowsBuffer);
	if(FAILED(hr))
	{
		ATLTRACE(L"Get Data Failed,Result code is %08X\n",hr);
		ReleaseRows();
		return FALSE;
	}
	return TRUE;
}

void COleDBRecordset::BindText(LPCOLESTR pColumnName, LPSTR ppTextValue, long* pTextLen)
{
	SetColumnInfo(pColumnName,DBTYPE_STR,ppTextValue,pTextLen,DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS);
}

void COleDBRecordset::BindText(LPCOLESTR pColumnName, LPWSTR ppTextValue, long* pTextLen)
{
	SetColumnInfo(pColumnName,DBTYPE_WSTR,ppTextValue,pTextLen,DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS);
}

void COleDBRecordset::BindLong(LPCOLESTR pColumnName, long* pLongValue, BOOL bReadonly)
{
	SetColumnInfo(pColumnName,DBTYPE_I4,pLongValue,NULL,DBPART_VALUE|DBPART_STATUS,NULL,bReadonly);
}

void COleDBRecordset::BindDouble(LPCOLESTR pColumnName, double* pDoubleValue)
{
	SetColumnInfo(pColumnName,DBTYPE_R8,pDoubleValue);
}

void COleDBRecordset::BindDataTime(LPCOLESTR pColumnName, DBTIMESTAMP* pDataTimeValue)
{
	SetColumnInfo(pColumnName,DBTYPE_DBTIMESTAMP,pDataTimeValue);
}

void COleDBRecordset::BindNumeric(LPCOLESTR pColumnName, DB_NUMERIC* pNumericValue)
{
	SetColumnInfo(pColumnName,DBTYPE_NUMERIC,pNumericValue);
}

void COleDBRecordset::BindLonglong(LPCOLESTR pColumnName, LONGLONG* pLonglongValue, BOOL bReadonly)
{
	SetColumnInfo(pColumnName,DBTYPE_I8,pLonglongValue,NULL,DBPART_VALUE|DBPART_STATUS,NULL,bReadonly);
}

void COleDBRecordset::BindCurrency(LPCOLESTR pColumnName, CURRENCY* pCurrencyValue)
{
	SetColumnInfo(pColumnName,DBTYPE_CY,pCurrencyValue);
}

void COleDBRecordset::BindBool(LPCOLESTR pColumnName, BOOL* pBoolValue)
{
	SetColumnInfo(pColumnName,DBTYPE_I4,pBoolValue);
}

void COleDBRecordset::BindFloat(LPCOLESTR pColumnName, float* pFloatValue)
{
	SetColumnInfo(pColumnName,DBTYPE_R4,pFloatValue);
}

void COleDBRecordset::BindShort(LPCOLESTR pColumnName, short* pShortValue, BOOL bReadonly)
{
	SetColumnInfo(pColumnName,DBTYPE_I2,pShortValue,NULL,DBPART_VALUE|DBPART_STATUS,NULL,bReadonly);
}

void COleDBRecordset::BindISequentialStream(LPCOLESTR pColumnName, ISequentialStream** ppIStreamValue, long* pLength)
{
	SetColumnInfo(pColumnName,DBTYPE_IUNKNOWN,ppIStreamValue,pLength,DBPART_VALUE| DBPART_LENGTH|DBPART_STATUS,&m_ObjectStruct);
	m_bHasObject=TRUE;
}

void COleDBRecordset::BindGUID(LPCOLESTR pColumnName, LPGUID pGUIDValue)
{
	SetColumnInfo(pColumnName,DBTYPE_GUID,pGUIDValue);
}

void COleDBRecordset::BindByteArray(LPCOLESTR pColumnName, LPBYTE ppByteArray, long* pLength, long nMaxLength)
{
	SetColumnInfo(pColumnName,DBTYPE_BYTES,ppByteArray,pLength,DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS,NULL,FALSE,nMaxLength);
}

LPCOLESTR COleDBRecordset::GetDefaultConnectString(void)
{
	_ASSERT(FALSE);
	return NULL;
}

void COleDBRecordset::SetFilter(LPCOLESTR pFilter)
{
	size_t nNewFBLen=::wcslen(pFilter)+1;
	if(nNewFBLen>m_nFBLen)
	{
		m_nFBLen=nNewFBLen;
		delete[] m_strFilter;
		m_strFilter=new WCHAR[m_nFBLen];
	}
	::wcscpy(m_strFilter,pFilter);
}

void COleDBRecordset::SetSort(LPCOLESTR pSort)
{
	size_t nNewSBLen=::wcslen(pSort)+1;
	if(nNewSBLen>m_nSBLen)
	{
		m_nSBLen=nNewSBLen;
		delete[] m_strSort;
		m_strSort=new WCHAR[m_nSBLen];
	}
	::wcscpy(m_strSort,pSort);
}
void COleDBRecordset::SetTable(LPCOLESTR pTable)
{
	size_t nNewTBLen=::wcslen(pTable)+1;
	if(nNewTBLen>m_nTBLen)
	{
		m_nTBLen=nNewTBLen;
		delete[] m_strTable;
		m_strTable=new WCHAR[m_nTBLen];
	}
	::wcscpy(m_strTable,pTable);
}

⌨️ 快捷键说明

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