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