?? oledbrecordset.cpp
字號:
#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 + -