?? maprecordset.cpp
字號(hào):
#include "stdafx.h"
#include "global.h"
#include "MapField.h"
#include "MapFields.h"
#include "MapTableDesc.h"
#include "MapRecordSet.h"
CMapRecordSet::CMapRecordSet()
{
m_CacheSize = 50;
bBOF = FALSE;
bEOF = FALSE;
m_bDbfOpen = FALSE;
iCursorPos = -1;
}
CMapRecordSet::~CMapRecordSet()
{
Clear();
}
long CMapRecordSet::GetRecordCount()
{
return m_Header.no_recs;
}
CMapFields* CMapRecordSet::GetFields(long lIndex)
{
long lCount;
CMapFields *fields = NULL;
CMapFields *pFields;
lCount = m_Fields.GetSize() - 1;
if ( lIndex < 0 || lIndex > lCount )
return fields;
pFields = m_Fields.GetAt(lIndex);
return pFields;
}
CMapTableDesc* CMapRecordSet::GetTableDesc()
{
return &m_TableDesc;
}
BOOL CMapRecordSet::GetBOF()
{
return bBOF;
}
BOOL CMapRecordSet::GetEOF()
{
return bEOF;
}
int CMapRecordSet::GetCacheSize()
{
return m_CacheSize;
}
BOOL CMapRecordSet::SetCacheSize(int& CacheSize)
{
if ( CacheSize < 0 || CacheSize > MAX_CACH_SIZE )
return FALSE;
return TRUE;
}
/*************************************************
描述: 打開DBF文件
輸入: 文件名
輸出: 成功返回TRUE 失敗返回FALSE
*************************************************/
BOOL CMapRecordSet::openDBF(CString& csFileName)
{
unsigned int iTemp;
unsigned long ulReocrdCount;
unsigned short ulLength,ulRecLength;
short i,sFieldCount;
char* pszBuffer;
FIELD_ELEMENT *pField,*pOldField;
CFileException fe;
//打開主文件
if ( !fDbf.Open(csFileName, CFile::modeRead|CFile::shareDenyWrite,&fe))
return FALSE;
m_bDbfOpen = TRUE;
fDbf.Seek(0L, CFile::begin);
//讀入文件頭
if ( fDbf.Read(&m_Header,sizeof(m_Header)) != sizeof(m_Header))
return FALSE;
ulReocrdCount = m_Header.no_recs;
ulLength = m_Header.head_len;
ulRecLength = m_Header.rec_len;
//計(jì)算字段個(gè)數(shù)
sFieldCount = (ulLength - sizeof(DBF_HEADER)-1)/sizeof(FIELD_ELEMENT);
iTemp = sFieldCount * sizeof(FIELD_ELEMENT) + 1;
pszBuffer = new char[iTemp];
if ( pszBuffer == NULL )
return FALSE;
//讀入字段描述部分?jǐn)?shù)據(jù)(表結(jié)構(gòu))
if ( fDbf.Read(pszBuffer,iTemp) != iTemp)
{
delete []pszBuffer;
return FALSE;
}
for ( i = 0 ; i < sFieldCount ; i++ )
{
pField = new FIELD_ELEMENT;
if ( pField == NULL )
{
delete []pszBuffer;
m_TableDesc.Clear();
return FALSE;
}
memcpy(pField,pszBuffer+i*sizeof(FIELD_ELEMENT),sizeof(FIELD_ELEMENT));
if ( i == 0 )
pField->ulOffset = 0;
else
pField->ulOffset = pOldField->ulOffset + pOldField->ucFieldLength;
//判斷字段類型
if ( pField->cFieldType != 'N' && pField->cFieldType != 'F' )
{
pField->ucFieldLength += pField->ucFieldDecimal*256;
pField->ucFieldDecimal = 0;
}
pOldField = pField;
m_TableDesc.Add(pField);
}
//讀入記錄到記錄集緩沖區(qū)
ReadRecord(0);
delete []pszBuffer;
return TRUE;
}
/*************************************************
描述: 讀入數(shù)據(jù)記錄
輸入: 記錄的索引(從0開始)
輸出: 無(wú)
*************************************************/
void CMapRecordSet::ReadRecord(unsigned long lRecordID)
{
int j,iRecordOffset;
char *pszBuffer;
char szBuff[255];
double dbValue;
FIELD_ELEMENT *pField;
CMapField *pMapField;
CMapFields *pMapFields;
VARIANT varValue;
if( lRecordID < 0 || lRecordID >= m_Header.no_recs)
return; //無(wú)效的索引值
if ( iCursorPos != lRecordID) //要讀取的記錄未在緩存中
{
//計(jì)算記錄相對(duì)文件頭的偏移量
iRecordOffset = lRecordID*m_Header.rec_len + m_Header.head_len;
pszBuffer = new char[ m_Header.rec_len];
fDbf.Seek(iRecordOffset , CFile::begin);
if ( fDbf.Read(pszBuffer,m_Header.rec_len) != m_Header.rec_len)
{
delete []pszBuffer;
return ;
}
Clear();
pMapFields = new CMapFields();
for ( j = 0 ; j < m_TableDesc.GetFieldCount() ; j++)
{
pMapField = new CMapField;
pField = m_TableDesc.GetDesc(j);
pMapField->SetName( CString(pField->szFieldName) );
pMapField->SetType(pField->cFieldType);
memset(szBuff , 0 , 255);
//略過(guò)該記錄是否刪除標(biāo)記字節(jié)pszBuffer+1
strncpy(szBuff, pszBuffer+1+pField->ulOffset , pField->ucFieldLength);
if ( pField->cFieldType == 'N' || pField->cFieldType == 'F' )
{
::VariantInit(&varValue);
dbValue = atof(szBuff );
if ( pField->ucFieldDecimal == 0 )
{
varValue.bVal = VT_I4;
varValue.lVal = (int)dbValue;
pMapField->SetType(fdInteger);
}
else
{
varValue.bVal = VT_R8;
varValue.dblVal = dbValue;
pMapField->SetType(fdDouble);
}
pMapField->SetValue(varValue);
}
else if ( pField->cFieldType == 'C' )
{
pMapField->SetValueAsString(CString(szBuff));
pMapField->SetType(fdString);
}
else
pMapField->SetType(fdInvaild);
pMapFields->Add(pMapField);
}
Clear(); //清空緩沖區(qū)加入新記錄
m_Fields.Add(pMapFields);
delete []pszBuffer;
iCursorPos = lRecordID;
}
}
/*************************************************
描述: 移動(dòng)到記錄集頭部
輸入: 無(wú)
輸出: 無(wú)
*************************************************/
void CMapRecordSet::MoveFirst()
{
if ( !m_bDbfOpen ) //數(shù)據(jù)庫(kù)文件未打開
return;
bBOF = TRUE;
bEOF = FALSE;
iCursorPos = -1;
ReadRecord(0);
}
/*************************************************
描述: 移動(dòng)到記錄集尾部
輸入: 無(wú)
輸出: 無(wú)
*************************************************/
void CMapRecordSet::MoveLast()
{
if ( !m_bDbfOpen )
return;
bEOF = TRUE;
ReadRecord(m_Header.no_recs - 1);
}
/*************************************************
描述: 移動(dòng)到下一條記錄
輸入: 無(wú)
輸出: 無(wú)
*************************************************/
void CMapRecordSet::MoveNext()
{
if ( !m_bDbfOpen )
return;
if ( m_Header.no_recs == 1 )
{
bBOF = TRUE;
bEOF = TRUE;
return;
}
if ( iCursorPos < m_Header.no_recs-1)
{
bBOF = FALSE;
ReadRecord(iCursorPos + 1);
}
else
bEOF = TRUE;
}
/*************************************************
描述: 移動(dòng)到上一條記錄
輸入: 無(wú)
輸出: 無(wú)
*************************************************/
void CMapRecordSet::MovePrev()
{
if ( !m_bDbfOpen ) //數(shù)據(jù)庫(kù)文件未打開
return;
if ( m_Header.no_recs == 1 )
{
bBOF = TRUE;
bEOF = TRUE;
return;
}
if ( iCursorPos > 0 )
{
bEOF = FALSE;
ReadRecord(iCursorPos - 1);
}
else
bBOF = TRUE;
}
/*************************************************
描述: 移動(dòng)iNumRecords條記錄
輸入: 移動(dòng)的記錄數(shù)、移動(dòng)相對(duì)位置
輸出: 無(wú)
*************************************************/
BOOL CMapRecordSet::Move(int iNumRecords , RECORDSTART Start )
{
int iPos;
/*if ( bEOF && iNumRecords > 0 ) //已經(jīng)到記錄集末尾
return FALSE;
if ( bBOF && iNumRecords < 0 ) //已經(jīng)到記錄集頭
return FALSE;
if ( iNumRecords == 0 )
return TRUE;*/
switch ( Start )
{
case BookmarkCurrent:
iPos = iCursorPos;
break;
case BookmarkLast:
iPos = m_Header.no_recs - 1;
break;
default: // BookmarkFirst
iPos = 0;
break;
}
if ( iNumRecords > 0 ) //向后移動(dòng)
{
if ( m_Header.no_recs <= (unsigned long)(iPos + iNumRecords))
return FALSE;
else
{
ReadRecord(iPos + iNumRecords);
return TRUE;
}
}
else
{
if ( (iPos + iNumRecords) < 0 )
return FALSE;
else
{
ReadRecord(iPos + iNumRecords);
return TRUE;
}
}
}
/*************************************************
描述: 清空記錄緩沖區(qū)
輸入: 無(wú)
輸出: 無(wú)
*************************************************/
void CMapRecordSet::Clear()
{
int i;
CMapFields *pMapFields;
for ( i = m_Fields.GetSize() - 1 ; i >=0 ; i-- )
{
pMapFields = m_Fields.GetAt(i);
delete pMapFields;
}
m_Fields.RemoveAll();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -