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

📄 oledbrecordset.cpp

📁 oledb封装类仿MFC的CRecordset
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include ".\dbkrnl.h"

COleDBRecordset::COleDBRecordset(void)
: m_pDatabase(NULL)
, m_nRowsCount(0)
, m_bIsBOF(FALSE)
, m_bIsEOF(FALSE)
, m_bIsOpen(FALSE)
, m_dwAddNewEdit(0)
, m_dwColumnsCount(0)
, m_dwColumns(0)
, m_hRow(NULL)
, m_hAccessor(NULL)
, m_pRowsBuffer(0)
, m_pColumnInfo(NULL)
, m_pBindingStatus(NULL)
, m_pColumnBinding(NULL)
, m_pAccessor(NULL)
, m_pRowset(NULL)
, m_pIRowsetChange(NULL)
, m_dwStatusReadonly(0)
, m_dwStatusReadWrite(0)
, m_bHasObject(FALSE)
, m_bOwnDatabase(FALSE)
, m_nTBLen(32)
, m_nFBLen(32)
, m_nSBLen(32)
, m_nHBLen(32)
{
	m_rgCmdPropSet[0].cProperties=20;
	m_rgCmdPropSet[0].guidPropertySet=DBPROPSET_ROWSET;
	m_rgCmdPropSet[0].rgProperties=new DBPROP[20];
	for(int i=0;i<20;i++)
	{
		::VariantInit(&m_rgCmdPropSet[0].rgProperties[i].vValue);
		m_rgCmdPropSet[0].rgProperties[i].dwOptions=DBPROPOPTIONS_OPTIONAL;
		m_rgCmdPropSet[0].rgProperties[i].colid=DB_NULLID;
	}
	m_rgCmdPropSet[0].rgProperties[0].dwPropertyID=DBPROP_IRowsetScroll;
	m_rgCmdPropSet[0].rgProperties[0].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[0].vValue.boolVal=VARIANT_FALSE;

	m_rgCmdPropSet[0].rgProperties[1].dwPropertyID=DBPROP_SERVERCURSOR;
	m_rgCmdPropSet[0].rgProperties[1].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[1].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[2].dwPropertyID=DBPROP_IRowsetChange;
	m_rgCmdPropSet[0].rgProperties[2].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[2].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[3].dwPropertyID=DBPROP_IRowsetLocate;
	m_rgCmdPropSet[0].rgProperties[3].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[3].vValue.boolVal=VARIANT_FALSE;

	m_rgCmdPropSet[0].rgProperties[4].dwPropertyID=DBPROP_IRowsetUpdate;
	m_rgCmdPropSet[0].rgProperties[4].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[4].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[5].dwPropertyID=DBPROP_BOOKMARKS;
	m_rgCmdPropSet[0].rgProperties[5].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[5].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[6].dwPropertyID=DBPROP_CANFETCHBACKWARDS;
	m_rgCmdPropSet[0].rgProperties[6].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[6].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[7].dwPropertyID=DBPROP_BOOKMARKS;
	m_rgCmdPropSet[0].rgProperties[7].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[7].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[8].dwPropertyID=DBPROP_CANHOLDROWS;
	m_rgCmdPropSet[0].rgProperties[8].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[8].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[9].dwPropertyID=DBPROP_LITERALBOOKMARKS;
	m_rgCmdPropSet[0].rgProperties[9].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[9].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[10].dwPropertyID=DBPROP_OTHERINSERT;
	m_rgCmdPropSet[0].rgProperties[10].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[10].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[11].dwPropertyID=DBPROP_OTHERUPDATEDELETE;
	m_rgCmdPropSet[0].rgProperties[11].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[11].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[12].dwPropertyID=DBPROP_OWNINSERT;
	m_rgCmdPropSet[0].rgProperties[12].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[12].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[13].dwPropertyID=DBPROP_OWNUPDATEDELETE;
	m_rgCmdPropSet[0].rgProperties[13].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[13].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[14].dwPropertyID=DBPROP_REMOVEDELETED;
	m_rgCmdPropSet[0].rgProperties[14].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[14].vValue.boolVal=VARIANT_TRUE;

	m_rgCmdPropSet[0].rgProperties[15].dwPropertyID=DBPROP_CHANGEINSERTEDROWS;
	m_rgCmdPropSet[0].rgProperties[15].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[15].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[16].dwPropertyID=DBPROP_SERVERDATAONINSERT;
	m_rgCmdPropSet[0].rgProperties[16].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[16].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[17].dwPropertyID=DBPROP_UNIQUEROWS;
	m_rgCmdPropSet[0].rgProperties[17].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[17].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[18].dwPropertyID=DBPROP_IMMOBILEROWS;
	m_rgCmdPropSet[0].rgProperties[18].vValue.vt=VT_BOOL;
	m_rgCmdPropSet[0].rgProperties[18].vValue.boolVal=VARIANT_FALSE;
	
	m_rgCmdPropSet[0].rgProperties[19].dwPropertyID=DBPROP_UPDATABILITY;
	m_rgCmdPropSet[0].rgProperties[19].vValue.vt=VT_I4;
	m_rgCmdPropSet[0].rgProperties[19].vValue.lVal=(long)DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE;
	m_ObjectStruct.dwFlags=STGM_READ;
	m_ObjectStruct.iid=IID_ISequentialStream;
	m_strFilter=new WCHAR[m_nFBLen];
	m_strFilter[0]=0;
    m_strSort=new WCHAR[m_nSBLen];
	m_strSort[0]=0;
	m_strTable=new WCHAR[m_nTBLen];
	m_strTable[0]=0;
	m_strHalfSQLStatement=new WCHAR[m_nHBLen];
	m_strHalfSQLStatement[0]=0;

}

COleDBRecordset::~COleDBRecordset(void)
{
	if(m_bIsOpen)
		Close();
	delete[] m_rgCmdPropSet[0].rgProperties;
	delete[] m_strFilter;
    delete[] m_strSort;
	delete[] m_strTable;
	delete[] m_strHalfSQLStatement;
}

void COleDBRecordset::AddNew(void)
{
#ifdef _DEBUG
	if(m_pIRowsetChange==NULL)
	{
		ATLTRACE(L"The table must be have primary key");
		return;
	}
#endif
	m_dwAddNewEdit=1;
}

void COleDBRecordset::Edit(void)
{
#ifdef _DEBUG
	if(m_pIRowsetChange==NULL)
	{
		ATLTRACE(L"The table must be have primary key");
		return;
	}
#endif
	m_dwAddNewEdit=2;
}

BOOL COleDBRecordset::Update(void)
{
	_ASSERT(m_dwAddNewEdit);
	HRESULT hr;
	HROW* pHRow;
	m_dwStatusReadonly=DBSTATUS_S_IGNORE;
	m_dwStatusReadWrite=DBSTATUS_S_OK;
	if(m_dwAddNewEdit==1)
	{
		ReleaseRows();
		pHRow = &m_hRow;
		hr = m_pIRowsetChange->InsertRow(DB_NULL_HCHAPTER,m_hAccessor,m_pRowsBuffer,pHRow);
		if(FAILED(hr))
		{
			ATLTRACE(L"Update of AddNew Failed,Result code is %08X\n",hr);
			return FALSE;
		}
		m_nRowsCount++;
	}
	else
	{
		hr=m_pIRowsetChange->SetData(m_hRow,m_hAccessor,m_pRowsBuffer);
		if(FAILED(hr))
		{
			ATLTRACE(L"Update of Edit Failed,Result code is %08X\n",hr);
			return FALSE;
		}
	}
	m_dwAddNewEdit=0;
	return TRUE;
}

void COleDBRecordset::Close(void)
{
	ReleaseRows();
//	if(m_pRowsBuffer)
//	{
//		delete[] m_pRowsBuffer;
//		m_pRowsBuffer=NULL;
//	}
	if(m_pColumnBinding)
	{
		delete[] m_pColumnBinding;
		m_pColumnBinding=NULL;
	}
	if(m_pBindingStatus)
	{
		delete[] m_pBindingStatus;
		m_pBindingStatus=NULL;
	}
	if(m_pAccessor)
	{
		m_pAccessor->ReleaseAccessor(m_hAccessor,NULL);
		m_pAccessor->Release();
		m_pAccessor=NULL;
	}
	if(m_pIRowsetChange)
	{
		m_pIRowsetChange->Release();
		m_pIRowsetChange=NULL;
	}
	if(m_pRowset)
	{
		m_pRowset->Release();
		m_pRowset=NULL;
	}
	if(m_bOwnDatabase)
	{
		m_pDatabase->Close();
		delete m_pDatabase;
		m_pDatabase=NULL;
		m_bOwnDatabase=FALSE;
	}
	m_bIsOpen=FALSE;
}

BOOL COleDBRecordset::Delete(void)
{
#ifdef _DEBUG
	if(m_pIRowsetChange==NULL)
	{
		ATLTRACE(L"The table must be have primary key");
		return FALSE;
	}
#endif
	HRESULT hr;
	hr = m_pIRowsetChange->DeleteRows(DB_NULL_HCHAPTER,1,&m_hRow,NULL);
	if(FAILED(hr))
	{
		ATLTRACE(L"Delete Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	return TRUE;
}

BOOL COleDBRecordset::MoveLast(void)
{
	ReleaseRows();
	m_pRowset->RestartPosition(DB_NULL_HCHAPTER);
	m_bIsEOF=TRUE;
	m_bIsBOF=FALSE;
	return Move(-1);
}

//BOOL COleDBRecordset::MovePrev(void)
//{
//	return Move(-2);
//}

//BOOL COleDBRecordset::MoveNext(void)
//{
//	return Move(0);
//}

BOOL COleDBRecordset::MoveFirst(void)
{
	ReleaseRows();
	m_pRowset->RestartPosition(DB_NULL_HCHAPTER);
	m_bIsBOF=TRUE;
	m_bIsEOF=FALSE;
	return Move(0);
}

BOOL COleDBRecordset::Move(long nSkipRows)
{
	BOOL bForward=TRUE;
	if(nSkipRows<0)
		bForward=FALSE;
	HRESULT hr;
	DWORD dwRowsFetched=0;
	HROW* phRow=&m_hRow;
	if(m_hRow)
	{
		m_pRowset->ReleaseRows(1, &m_hRow, NULL, NULL, NULL);
		m_hRow=NULL;
	}
	hr=m_pRowset->GetNextRows(DB_NULL_HCHAPTER,nSkipRows,1, &dwRowsFetched,&phRow);
	if(FAILED(hr))
	{
		ATLTRACE(L"Move Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	else if(hr==DB_S_ENDOFROWSET)
	{
		if(bForward)
			m_bIsEOF=TRUE;
		else
			m_bIsBOF=TRUE;
		return FALSE;
	}
	if(bForward&&m_bIsBOF)
		m_bIsBOF=FALSE;
	else if((!bForward)&&m_bIsEOF)
		m_bIsEOF=FALSE;
	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;
}

BOOL COleDBRecordset::Open(COleDBDatabase* pDatabase, LPCOLESTR pTable, LPCOLESTR pColumnNames)
{
	_ASSERT(pTable);
	if(pDatabase)
		m_pDatabase=pDatabase;
	else
	{
		m_pDatabase=new COleDBDatabase;
		if(!m_pDatabase->Open(GetDefaultConnectString()))
		{
			delete m_pDatabase;
			return FALSE;
		}
		m_bOwnDatabase=TRUE;
	}
	size_t nNewTBLen=::wcslen(pTable)+3;
	if(nNewTBLen>m_nTBLen)
	{
		m_nTBLen=nNewTBLen;
		delete[] m_strTable;
		m_strTable=new WCHAR[m_nTBLen];
	}
	if(::wcschr(pTable,L'['))
		::wcscpy(m_strTable,pTable);
	else
	{
		::wcscpy(m_strTable,L"[");
		::wcscat(m_strTable,pTable);
		::wcscat(m_strTable,L"]");
	}
	m_bIsOpen=Requery(pColumnNames);

	return m_bIsOpen;
}

BOOL COleDBRecordset::Requery(LPCOLESTR pColumnNames)
{
	IDBCreateCommand* pIDBCreateCommand=NULL;
	IDBCreateSession* pIDBCreateSession=NULL;
	ICommand* pICommand=NULL;

⌨️ 快捷键说明

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