第十一章 访问数据库 - 首都师范大学
- 格式:doc
- 大小:50.00 KB
- 文档页数:4
索 引 11.1 练习题11及参考答案1.什么是索引?索引分为哪两种?各有什么特点?答:索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。
根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型:∙ 聚簇索引:数据表的物理顺序和索引表的顺序相同,它根据表中的一列或多列值的组合排列记录。
∙ 非聚簇索引:数据表的物理顺序和索引表的顺序不相同,索引表仅仅包含指向数据表的指针,这些指针本身是有序的,用于在表中快速定位数据。
2.创建索引有什么优、缺点?答:创建索引的优点如下:(1)加速数据检索。
(2)加快表与表之间的联接。
(3)在使用ORDER BY 和GROUP BY 等子句进行数据检索的时候,可以减少分组和排序的时间。
(4)有利于SQL Server 对查询进行优化。
(5)强制实施行的惟一性。
创建索引的缺点如下:(1)创建索引要花费时间和占用存储空间。
(2)建立索引加快了数据检索速度,却减慢了数据修改速度。
3.哪些列上适合创建索引?哪些列上不适合创建索引?答:一般来说,以下的列适合创建索引:(1)主键:通常检索、存取表是通过主键来进行的,因此,应该考虑在主键上建立索引。
(2)连接中频繁使用的列:用于连接的列若按顺序存放,则系统可以很快地执行连接。
如外键,除用于实现参照完整性外,还经常用于进行表的连接。
(3)在某一范围内频繁搜索的列和按排序顺序频繁检索的列。
以下的列不适合创建索引:第 章11(1)很少或从来不在查询中引用的列,因为系统很少或从来不根据这个列的值去查找数据行。
(2)只有两个或很少几个值的列(如性别,只有两个值“男”或“女”),以这样的列创建索引并不能得到建立索引的好处。
(3)以bit、text、image数据类型定义的列。
(4)数据行数很少的小表一般也没有必要创建索引。
4.创建索引时须考虑哪些事项?答:使用CREA TE INDEX语句创建索引。
默认情况下,如果未指定聚集选项,将创建非聚集索引。
1. ODBC(Open Database Connectivity)是微软的开放服务体系结构WOSA中有关数据库的一个组成部分。
一个基于ODBC的应用程序可以不依赖任何访问数据库。
这种访问操作是依赖于不同DBMS的ODBC 和ODBC实现的。
ODBC是一种结构,它由下列部件自上向下组成:
⑴;
⑵,用于管理被安装的ODBC驱动程序和;
⑶,用于管理驱动程序;
⑷ ODBC;
⑸ ODBC,提供ODBC和数据库之间的。
⑹,包含了和等信息,是一种数据连接抽象。
2. MFC为ODBC提供的用于建立与数据源连接的类CDatabase;在构造了一个该类对象之后,必须调用成员函数Open或OpenEx才能建立与数据库的连接。
其中Open的原型如下:
virtual BOOL Open( LPCTSTR lpszDSN,
BOOL bExclusive = FALSE,
BOOL bReadOnly = FALSE,
LPCTSTR lpszConnect= “ODBC;”,
BOOL bUseCursorLib = TRUE );
throw( CDBException, CMemoryException );
例如在一个应用程序中定义了一个数据源连接类对象:
CDatabase m_db;
并需要与一个指定的用户身份UID=ZYF用户口令PWD=1234的数据源DSN = Student Registration以ODBC方式连接,该连接为共享、可读写并使用光标库,试写出两种用于实现该连接操作(可以忽略异常的俘获处理操作)的Open函数调用表达式:
答案:
3. MFC为ODBC提供的用于从数据源选择一组记录集的类CRecordset在构造了一个该类象对之后,然后调用Open成员函数按照指定的SELECT命令语句或表名查询数据源中的记录并建立记录集。
CRecordset类构造函数的原型声明如下:
CRecordset( CDatabase* pDatabase = NULL);
根据pDatabase所传值的不同,构造记录集对象分为三种情况:
⑴ pDatabase指向一个CDatabase类对象,并且该对象已经通过调用CDatabase::Open
成员函数与一个指定的数据源成功连接,则记录集类构造函数的操作过程为:
在该数据源类对象上建立→调用CRecordset::Open。
⑵ pDatabase指向一个CDatabase类对象,但该对象没有与指定的数据源连接,则记录
集类构造函数的操作过程为:
在该数据源类对象上建立→调用与缺省指定的数据源连接→调用CRecordset::建立记录集。
⑶ pDatabase = NULL,则记录集类构造函数的操作过程为:
建立→调用的构造函数建立数据源连接对象→调用
连接缺省指定的数据源→调用建立记录集。
4. MFC为ODBC提供了用于与某个记录集直接相连的表单视图类,该类可以通过数据交换机制DDX在与表单视图控件之间的;而记录集字段数据与相应数据库的字段之间数据交换是通过CRecordset::实现的,该函数的参数是一个指针,指向记录字段数据交换机制的
对象。
5. 在记录集中,修改当前记录的操作必须按下列步骤进行:
⑴调用CRecordset::函数,进入模式。
该函数将当前域数据成员的内容保
存到中。
若调用Move(AFX_MOVE_REFRESH)可恢复数据,退出
模式。
⑵在模式下数据域成员的新值。
⑶调用CRecordset::函数,将改变后的记录写回并退出模式。
按照上述操作步骤,在CRecordView::OnMove函数中添加修改当前记录的功能,尝试在如下程序的空白处添入正确的代码:
virtual BOOL CRecordView::OnMove(UINT nIDMoveCommand)
{
CRecordset* pSet = OnGetRecordset();
if(pSet->CanUpdate())
{
pSet->; // 进入修改记录模式
if(!) //为数据域成员设置新值
return TRUE ;
pSet->; // 修改数据源
}
…
UpdateData(FALSE);
return TRUE;
}
6. 在记录集中,添加一个新记录的操作必须按下列步骤进行:
⑴调用CRecordset::函数,进入模式。
该函数将当前域数据成员的内
容保存到并将所有域数据成员都设置NULL。
若调用
Move(AFX_MOVE_REFRESH)可恢复数据,并退出模式。
⑵在模式下域数据成员的值。
⑶调用CRecordset::函数,将改变后的记录写回并退出模式。
例如,在CRecordView的派生类CSectionForm中定义了成员函数OnRecordAdd用于向记录集中添加新记录,其主要代码如下,试在程序的空白处添入正确的代码:
提示:由于CRecordView::OnMove成员函数在实现记录移动操作之前,需要通过调用成员函数CRecordset::Update使当前记录更新,所以调用OnMove隐含了对数据源的更新和退出记录的编辑或添加模式。
void CSectionForm::OnRecordAdd()
{
if(m_bAddMode) // m_bAddMode = TRUE指示记录集当前处于添加模式
(ID_RECORD_FIRST); // ID_RECORD_FIRST记录集首位置…
m_pSet->; // 进入添加新记录模式
m_pSet->SetFieldNull(&(m_pSet->m_CourseID), FALSE); // 设置数据域为空
…
m_bAddMode = ; // 设置添加模式状态标志
…
UpdateData(FALSE);
}
7. 在记录集中,删除当前记录的操作必须按下列步骤进行:
⑴调用CRecordset::函数,同时给和中的当前记录加上删除
标志。
⑵到另一个,跳过已删除的记录。
例如,在CRecordView的派生类CSectionForm中定义了成员函数OnRecordDelete用于从记录集中删除当前记录,其代码如下,试在程序的空白处添入正确的代码:
void CSectionForm::OnRecordDelete()
{
try
{
m_pSet->; // 为指定的记录集设置删除标志}
catch(CDBException, e)
{
AfxMessageBox(e->m_strError);
return;
}
m_pSet->; // 移动到下一记录,删除指定记录
if(m_pSet->IsEOF())
m_pSet->; // 移动到最后一个记录
if(m_pSet->IsBOF())
m_pSet->SetFieldNull(NULL); // 设置记录集为空
UpdateData(FALSE);
}
X。