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

📄 pcdmaccessdb.cpp

📁 是一本关于
💻 CPP
字号:
// PCDMAccessDB.cpp : Implementation of CPCDMAccessDB
#include "stdafx.h"
#include "PCDMDLL.h"
#include "PCDMAccessDB.h"

/////////////////////////////////////////////////////////////////////////////
// CPCDMAccessDB

// <BOOK_ADDON STEP4 Chapter 8.3.3> ******************************************
#define	PCDM_DB	833

STDMETHODIMP CPCDMAccessDB::AddProperty(VARIANT PID, long Sorted)
{
#ifdef UNDER_CE
VARIANT tvPID;

	if (Sorted==TRUE)
	{
		VariantInit(&tvPID);
		VariantChangeType(&tvPID,&PID,0,VT_I4);
		m_DBSortOrder[m_SortCnt].propid=MAKELONG(CEVT_LPWSTR,tvPID.lVal);
		m_DBSortOrder[m_SortCnt].dwFlags=CEDB_SORT_GENERICORDER;
		m_SortCnt++;
	}
#endif
	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::CreateTable(BSTR FileLocation, BSTR Name)
{
#ifdef UNDER_CE
CEOID	CeOid=0;
HANDLE	tHandle;


	tHandle = CeOpenDatabase(&CeOid,Name,0,0,NULL);          	
	if (tHandle!= INVALID_HANDLE_VALUE)
	{
		CloseHandle(tHandle);
		CeDeleteDatabase(CeOid);
	}
	if ((CeOid = CeCreateDatabase(Name,PCDM_DB,
      m_SortCnt,m_DBSortOrder))==NULL)
		return S_FALSE;
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::OpenTable(BSTR FileLocation, BSTR Name, VARIANT PID, long *Handle)
{
#ifdef UNDER_CE
CEOID	CeOid=0;
HANDLE	hDataBase; 
CEPROPID	tPID=0;
VARIANT tvPID;

	VariantInit(&tvPID);
	VariantChangeType(&tvPID,&PID,0,VT_I4);
	for (int i=0;i<m_SortCnt;i++)
	{
		if (HIWORD(m_DBSortOrder[i].propid)==tvPID.lVal)
		{
			tPID=MAKELONG(LOWORD(m_DBSortOrder[i].propid),tvPID.lVal);
			break;
		}
	}
	hDataBase = CeOpenDatabase(&CeOid,Name,tPID,0,NULL);          	
	if (hDataBase == INVALID_HANDLE_VALUE)
	{
		*Handle=0;
		return S_FALSE;	
	}
	*Handle=(long)hDataBase;
	VariantCopy(&m_ActPID,&PID);
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::CloseTable(long Handle)
{
	m_SortCnt=0;
	m_rfldCnt=0;
#ifdef UNDER_CE
	CloseHandle((HANDLE)Handle);
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::MoveFirst(long Handle)
{
#ifdef UNDER_CE
	if (!(m_curRec=CeSeekDatabase((HANDLE)Handle,CEDB_SEEK_BEGINNING, 0, &m_dwIndex)))
		return S_FALSE;
#endif
	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::MoveLast(long Handle)
{
#ifdef UNDER_CE
	if (!(m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_END,0, &m_dwIndex)))
		return S_FALSE;
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::MoveNext(long Handle)
{
#ifdef UNDER_CE
	if (!(m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_CURRENT, 1, &m_dwIndex)))
		return S_FALSE;
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::MovePrevious(long Handle)
{
#ifdef UNDER_CE
	if (!(m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_CURRENT, -1, &m_dwIndex)))
		return S_FALSE;
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::FindRecord(long Handle, VARIANT PID, VARIANT Value)
{
#ifdef UNDER_CE
CEPROPVAL tPropVal;
DWORD	tdwIndex;
VARIANT tvPID,tvValue;

	VariantInit(&tvPID);
	VariantInit(&tvValue);
	VariantChangeType(&tvPID,&PID,0,VT_I4);

	if (tvPID.lVal!=m_ActPID.lVal) return S_FALSE;
	tPropVal.wLenData = 0;
	tPropVal.wFlags = 0;
	VariantChangeType(&tvValue,&Value,0,VT_BSTR);
	tPropVal.propid=MAKELONG(CEVT_LPWSTR,m_ActPID.lVal);
	tPropVal.val.lpwstr=tvValue.bstrVal;

	tdwIndex=m_dwIndex;
	if (!(m_curRec=CeSeekDatabase((HANDLE)Handle,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&tPropVal, &tdwIndex)))
	{
		m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_BEGINNING, m_dwIndex, &m_dwIndex);
		return S_FALSE;
	}
	m_dwIndex=tdwIndex;
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::AddNewRecord(long Handle)
{
#ifdef UNDER_CE
	m_curRec=0;
#endif
	m_wfldCnt=0;

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::SetValue(VARIANT PID, VARIANT Value)
{
#ifdef UNDER_CE
VARIANT tValue,tvPID;

	if (m_wfldCnt>9) return S_FALSE; 
	VariantInit(&tValue);
	VariantChangeType(&tValue,&Value,0,VT_BSTR);
	VariantInit(&tvPID);
	VariantChangeType(&tvPID,&PID,0,VT_I4);

	m_wFields[m_wfldCnt].propid=MAKELONG(CEVT_LPWSTR,tvPID.lVal);
	m_BStr[m_wfldCnt]=SysAllocString(tValue.bstrVal);
	m_wFields[m_wfldCnt].val.lpwstr=m_BStr[m_wfldCnt];
	m_wFields[m_wfldCnt].wLenData = 0;
	m_wFields[m_wfldCnt].wFlags = 0;
	m_wfldCnt++;
#endif
	return S_OK;
}


STDMETHODIMP CPCDMAccessDB::WriteRecord(long DBHandle)
{
#ifdef UNDER_CE
	if(!CeWriteRecordProps((HANDLE)DBHandle, m_curRec, m_wfldCnt, m_wFields) )
		return S_FALSE; 
	for (int i=0;i<m_wfldCnt;i++)
		SysFreeString(m_BStr[i]);	
	m_wfldCnt=0;
#endif

	return S_OK;
}

STDMETHODIMP CPCDMAccessDB::ReadRecord(long DBHandle, long *Count)
{
#ifdef UNDER_CE
LPBYTE	pData=NULL;
DWORD	cbData=0;

	m_rfldCnt=0;
	if(!CeReadRecordProps((HANDLE)DBHandle, CEDB_ALLOWREALLOC, &m_rfldCnt,NULL,&pData,&cbData))
	{
		DWORD err=GetLastError();
		m_rFields=NULL;
		return S_FALSE; 
	}
	m_rFields=(CEPROPVAL*)pData;
	*Count=m_rfldCnt;
#endif
	return S_OK;
}


STDMETHODIMP CPCDMAccessDB::GetValue(VARIANT PID, VARIANT *Value)
{
#ifdef UNDER_CE
CEPROPVAL	*Flds=NULL;
VARIANT		tvPID;

	if (m_rFields==NULL || m_rfldCnt==0) return S_FALSE; 
	VariantInit(Value);
	VariantInit(&tvPID);
	VariantChangeType(&tvPID,&PID,0,VT_I4);

	for (int i=0;i<m_rfldCnt;i++)
	{
		if (HIWORD(m_rFields[i].propid)==tvPID.lVal)
		{
			Flds=&m_rFields[i];
			break;
		}
	}
	if (Flds==NULL) return S_FALSE;

	Value->vt=VT_BSTR;
	Value->bstrVal=SysAllocString((TCHAR*)Flds->val.lpwstr);
#endif
	return S_OK;
}

⌨️ 快捷键说明

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