MS SQL Server数据库数据文件页面头部结构--公司招聘软件研发程序员的一道考题
2011-08-13 23:30 魔幻数据 阅读(280) 评论(0) 编辑 收藏 举报有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下:
有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个Byte(字节)]为一个页进行分组并编号。
如:
文件的0-15sec(0-8191byte) 为第0页
文件的16-31sec(8192-16383byte) 为第1页
文件的32-47sec(16384-24575byte) 为第2页 以此类推
每个页的头96个字节结构如下:(注意:这里是每个页头部96Byte,1页大小是16 sec,8192 bytes)
struct mdfPageHeader //文件页头部结构
{
UINT8 m_headerVersion; //版本
UINT8 m_type; //页类型
UINT8 m_typeFlagBits;
UINT8 m_level;
UINT8 m_flagBits;
UINT8 m_reservedB;
UINT16 m_indexId;
UINT32 m_prevPage_id;
UINT16 m_prevPage_fid;
UINT16 pminlen;
UINT32 m_nextPage_id;
UINT16 m_nextPage_fid;
UINT16 m_slotCnt;
UINT32 m_objId; //所属对象ID
UINT16 m_freeCnt;
UINT16 m_freeData;
UINT32 m_pageId_id; //每页编号
UINT16 m_pageId_fid;
UINT16 m_reservedCnt;
UINT32 m_lsn_d1;
UINT32 m_lsn_d2;
UINT16 m_lsn_w1;
UINT16 m_xactReserved;
UINT32 m_xdesId_id;
UINT16 m_xdesId_fid;
UINT16 m_ghostRecCnt;
UINT32 m_tornBits;
UINT64 temp1;
UINT64 temp2;
UINT64 temp3;
UINT64 temp4;
};
用VC++完成下面编程:
把符合m_headerVersion==1、m_type==1、m_objId==1三个条件的页面(16sec)找出来,
并把这些页面按照查询先后顺序写到另一个文件file.b文件中。
提示:
打开和创建文件可以用下面两种方法来实现
1、CFile fileo,filew;
fileo.Open("file.a",CFile::modeRead|CFile::typeBinary);
filew.Open("file.b",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
2、HANDLE hFileA,hfileB;
hFileA = CreateFile(_T("file.a"),GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
hFileB = CreateFile(_T("file.b"),GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);