📄 pcdmaccessdb.cpp
字号:
// PCDMAccessDB.cpp : Implementation of CPCDMAccessDB
#include "stdafx.h"
#include "PCDMDLL.h"
#include "PCDMAccessDB.h"
/////////////////////////////////////////////////////////////////////////////
// CPCDMAccessDB
// <BOOK_ADDON STEP5 Chapter 8.4.2> **************************************************
void __stdcall _com_issue_error(HRESULT hr)
{
// Error handling goes here!
}
// </BOOK_ADDON STEP5 Chapter 8.4.2> **************************************************
// <BOOK_ADDON STEP4 Chapter 8.3.3> ******************************************
#define PCDM_DB 833
STDMETHODIMP CPCDMAccessDB::AddProperty(VARIANT PID, long Sorted)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
VARIANT tvPID;
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
if (m_SortCnt<10)
{
VariantInit(&tvPID);
VariantChangeType(&tvPID,&PID,0,VT_I4);
m_DBSortOrder[m_SortCnt].propid=MAKELONG(CEVT_LPWSTR,tvPID.lVal);
if (Sorted)
m_DBSortOrder[m_SortCnt].dwFlags=CEDB_SORT_GENERICORDER;
else
m_DBSortOrder[m_SortCnt].dwFlags=0;
m_SortCnt++;
}
return S_OK;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
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 // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::CreateTable(BSTR FileLocation, BSTR Name)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
CEOID CeOid=0;
HANDLE tHandle;
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
TCHAR strSQL[1024],tStr[200];
wsprintf(strSQL,TEXT("CREATE DATABASE '%s'"),FileLocation);
HRESULT hr=m_RS->Open(_variant_t(strSQL),_variant_t(TEXT("")),adOpenForwardOnly , adLockReadOnly , 1);
wsprintf(strSQL,TEXT("DROP TABLE %s"),Name);
hr=m_RS->Open(_variant_t(strSQL),_variant_t(FileLocation),adOpenForwardOnly , adLockReadOnly , 1);
wsprintf(strSQL,TEXT("CREATE TABLE %s ("),Name);
for (int i=0; i<m_SortCnt; i++)
{
wsprintf(tStr,TEXT("Fld%d varchar(200)"),HIWORD(m_DBSortOrder[i].propid));
wcscat(strSQL,tStr);
if (i<m_SortCnt-1)
wcscat(strSQL,TEXT(","));
else
wcscat(strSQL,TEXT(")"));
}
hr=m_RS->Open(_variant_t(strSQL),_variant_t(FileLocation),adOpenForwardOnly , adLockReadOnly , 1);
m_SortCnt=0;
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
tHandle = CeOpenDatabase(&CeOid,Name,0,0,NULL);
if (tHandle!= INVALID_HANDLE_VALUE)
{
#ifdef UNDER_CE
CloseHandle(tHandle);
#else
CeCloseHandle((HANDLE)tHandle);
#endif
CeDeleteDatabase(CeOid);
}
if ((CeOid = CeCreateDatabase(Name,PCDM_DB,
m_SortCnt,m_DBSortOrder))==NULL)
return S_FALSE;
//#endif // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::OpenTable(BSTR FileLocation, BSTR Name, VARIANT PID, long *Handle)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
CEOID CeOid=0;
HANDLE hDataBase;
CEPROPID tPID=0;
VARIANT tvPID;
VariantInit(&tvPID);
VariantChangeType(&tvPID,&PID,0,VT_I4);
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
TCHAR strSQL[1024],tStr[200];
HRESULT hr;
wsprintf(strSQL,TEXT("SELECT * FROM %s "),Name);
wsprintf(tStr,TEXT("Order By Fld%d "),tvPID.lVal);
wcscat(strSQL,tStr);
hr=m_RS->Open(_variant_t(strSQL),_variant_t(FileLocation),adOpenKeyset , adLockOptimistic , 1);
*Handle=(long)m_RS;
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
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 // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::CloseTable(long Handle)
{
m_SortCnt=0;
m_rfldCnt=0;
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
HRESULT hr=m_RS->Close();
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
#ifdef UNDER_CE // <BOOK_MOVEDHERE STEP6 Chapter 9.2.3> *****
CloseHandle((HANDLE)Handle);
//<BOOK_ADDON STEP6 Chapter 9.2.3> *********************************
#else
CeCloseHandle((HANDLE)Handle);
//</BOOK_ADDON STEP6 Chapter 9.2.3> *********************************
#endif
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::MoveFirst(long Handle)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
HRESULT hr=m_RS->MoveFirst();
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (!(m_curRec=CeSeekDatabase((HANDLE)Handle,CEDB_SEEK_BEGINNING, 0, &m_dwIndex)))
return S_FALSE;
//#endif // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::MoveLast(long Handle)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
HRESULT hr=m_RS->MoveLast();
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (!(m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_END,0, &m_dwIndex)))
return S_FALSE;
//#endif // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::MoveNext(long Handle)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
HRESULT hr=m_RS->MoveNext();
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (!(m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_CURRENT, 1, &m_dwIndex)))
return S_FALSE;
//#endif // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::MovePrevious(long Handle)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (m_useADO!=PCDMADO_NONE)
{
HRESULT hr=m_RS->MovePrevious();
return hr;
}
//</BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
if (!(m_curRec=CeSeekDatabase((HANDLE)Handle, CEDB_SEEK_CURRENT, -1, &m_dwIndex)))
return S_FALSE;
//#endif // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
return S_OK;
}
STDMETHODIMP CPCDMAccessDB::FindRecord(long Handle, VARIANT PID, VARIANT Value)
{
//#ifdef UNDER_CE // <BOOK_DELETED STEP6 Chapter 9.2.3> *****
VARIANT tvPID,tvValue;
VariantInit(&tvPID);
VariantInit(&tvValue);
VariantChangeType(&tvPID,&PID,0,VT_I4);
VariantChangeType(&tvValue,&Value,0,VT_BSTR);
//<BOOK_ADDON STEP5 Chapter 8.4.2> *********************************
switch (m_useADO)
{
case PCDMADO_V2:
case PCDMADO_V3:
{
Fields *pFields;
Field20 *pField20;
Field *pField;
HRESULT hr;
TCHAR tFldName[10];
VARIANT_BOOL tBOF,tEOF;
VARIANT value,tBookMark;
VariantInit(&tBookMark);
m_RS->get_Bookmark(&tBookMark);
m_RS->get_BOF(&tBOF);
m_RS->get_EOF(&tEOF);
if(!(tBOF==VARIANT_TRUE && tEOF==VARIANT_TRUE))
{
while (tEOF!=VARIANT_TRUE)
{
m_RS->get_Fields(&pFields);
wsprintf(tFldName,TEXT("Fld%d"),tvPID.lVal);
if (m_useADO==PCDMADO_V3)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -