CRecordset类的常用成员函数 成员变量 以及操作实例

CRecordset类的常用成员函数 成员变量 以及操作实例


Open() : 打开记录集,在CRecordse类负责的一个表中,将该表看做是一个记录集,即一个数据库中的表的元组对应一个记录,表的所有元组就是一个记录的集合。


AddNew():将一个新的记录插入到表中


Update()      完成AddNew() 或 Edit()操作之后,调用该函数在内存中的数据保存到磁盘数据库中。


MoveNext() :将当前记录设置到下一个记录


MovePrev()   将当前记录设置到上一个记录


MoveFrist() 将当前记录设置到记录集的第一个记录


MoveLast() 将当前记录设置到记录集的最后一个记录


IsBOF()    判断是否定位于第一个记录之前


IsEOF() 判断是否定位于最后一个记录之后


Edit() 执行对当前记录的修改


Delete() 删除当前记录


GetDefaultConnect() 获得数据源的默认连接字符串


GetDefaultSQL()    获取默认的SQL字符串


DoFieldExchange()   在记录集和数据源之间进行数据交换


GetStatus() 获取当前记录的索引


GetRecordCount() 获取用户在记录集中移动时所经过的记录数目


GetODBCFieldInfo() 获取域信息


GetODBCFieldCount() 获取记录集对象中的域的数目




Data Membersm_hstmt
 Contains the ODBC statement handle for the recordset. Type HSTMT.
 
m_nFields
 Contains the number of field data members in the recordset. Type UINT.
 
m_nParams
 Contains the number of parameter data members in the recordset. Type UINT.
 
m_pDatabase
 Contains a pointer to the CDatabase object through which the recordset is connected to a data source.
 
m_strFilter
 Contains a CString that specifies a Structured Query Language (SQL) WHERE clause. Used as a filter to select only those records that meet certain criteria.
 
m_strSort
 Contains a CString that specifies a SQL ORDER BY clause. Used to control how the records are sorted.
 


实例:


打开MFC ClassWizard,


为控件IDC_EDIT_QUERY添加关联变量m_strQuery。 
在CEx_ODBCView类中添加按钮控件IDC_BUTTON_QUERY的BN_CLICKED消息映射,在映射函数中添加代码: 
void CEx_ODBCView::OnButtonQuery() 

UpdateData(); 
m_strQuery.TrimLeft(); 
if (m_strQuery.IsEmpty()) 
{ MessageBox("要查询的学号不能为空!"); 
return; 

if (m_pSet->IsOpen()) 
m_pSet->Close();


// 如果记录集打开,则先关闭 
m_pSet->m_strFilter.Format("studentno='%s'",m_strQuery); 
// studentno是score表的字段名,用来指定查询条件 
m_pSet->m_strSort = "course"; // course是score表的字段名,用来按course字段从小到大排序 
m_pSet->Open(); 
if (!m_pSet->IsEOF()) // 如果打开记录集有记录 
UpdateData(FALSE); // 自动更新表单中控件显示的内容 
else MessageBox("没有查到你要找的学号记录!"); 





增加记录 
增加记录是使用AddNew函数,但要求数据库必须是以“可增加”的方式打开的。
下面的代码是在表的末尾增加新记录: 
m_pSet->AddNew(); // 在表的末尾增加新记录 
m_pSet->SetFieldNull(&(m_pSet->m_studentno), FALSE); // 设定m_studentno值不为空(NULL) 
m_pSet-> m_studentno = "21010503"; ......    // 输入新的字段值 
m_pSet->Update(); // 将新记录存入数据库 
m_pSet->Requery(); // 刷新记录集,这在快照集方式下是必须的 


删除记录 
可以直接使用CRecordSet::Delete函数来删除记录。要使删除操作有效,还需要移动记录函数。
例如下面的代码: 
CRecordsetStatus status; m_pSet->GetStatus(status); // 获取当前记录集状态 
m_pSet->Delete(); // 删除当前记录 
if (status.m_lCurrentRecord==0) // 当前记录索引号,0表示第一条记录 
m_pSet->MoveNext(); // 下移一个记录 
else m_pSet->MoveFirst(); // 移动到第一个记录处 
UpdateData(FALSE); 






修改记录 
函数CRecordSet::Edit可以用来修改记录,例如: 
m_pSet->Edit();    // 修改当前记录 
m_pSet->m_name="刘向东"; // 修改当前记录字段值 ...... 
m_pSet->Update();   // 将修改结果存入数据库 
m_pSet->Requery(); 


撤消操作 
如果用户在进行增加或者修改记录后,希望放弃当前操作,则在调用CRecordSet::Update()函数之前调用CRecordSet::Move(AFX_MOVE_REFRESH)来撤消操作,便可恢复在增加或修改操作之前的当前记录。








CRecordset类几个成员函数使用注意


short GetODBCFieldCount()
该函数用于获取表的项目数。比如一个学生成绩表,该表含学号、姓名、语文成绩、数学成绩、英语成绩五项,那么GetODBCFieldCount()返回5。值得注意的是,CRecordset中有一个m_nFields成员变量,该成员表示打开表时所选的,或所关注的项目数。GetODBCFieldCount()返回的值与m_nFields无关。 
long GetRecordCount()
该函数用于返回表中的记录条目数。需要注意的是,内部的计数器仅保持当前已看到的记录数。比如一个非空表,该表打开时只能看到1个记录。为了得到该表的准确的总记录数目,必须移动越过最后一个记录才能得到。也就是说,你必须不断地MoveNext()直到IsEOF()返回非0。而直接MoveLast()是无法得出准确值的。
CRecordset::AddNew()并且CRecordset::Update()时数量增1,CRecordset::Delete()减1。 
void GetStatus(CRecordsetStatus& rStatus)
该函数用于返回当前记录的序号,以及最后一条记录是否已经被确定。CRecordset试图跟踪记录序号,但某些条件下并不能够。
CRecordsetStatus有两个成员项。一个是m_lCurrentRecord,另一个是m_bRecordCountFinal。
如果已经可以确定,m_lCurrentRecord包含基数为0的记录序号;如果记录序号无法确定,该成员值为AFX_CURRENT_RECORD_UNDEFINED(-2)。如果ISBOF()为TRUE(空表,或者从第1个记录又往前滚动了),该成员值为AFX_CURRENT_RECORD_BOF (-1)。如果位于第1个记录,则为0,第二个是1,如此类推。
m_bRecordCountFinal:如果总的记录数已经确定,该变量为非0,通常地,这必须从头开始不断地调用MoveNext()直到IsEOF()返回非0
 
样本程序:
        CEegEvent EventSet;
        EventSet.m_strFilter.Format("PatientID=%d AND SegmentID=%d",m_oldPatientID,m_pEegSet->m_SegmentID);
        EventSet.m_strSort = "";
        EventSet.Open();
       
        TRACE("-----------------------------------------\n");
        TRACE("1:     GetRecordCount() = %d\n",EventSet.GetRecordCount());
       
        EventSet.MoveLast();
        TRACE("2:     GetRecordCount() = %d\n",EventSet.GetRecordCount());
       
        EventSet.MoveFirst();
        TRACE("3:     GetRecordCount() = %d\n",EventSet.GetRecordCount());
       
        CRecordsetStatus rStatus;
        while(!EventSet.IsEOF())
        {
               EventSet.GetStatus(rStatus);
               TRACE("4:     GetRecordCount() = %d,rStatus.m_lCurrentRecord = %d,rStatus.m_bRecordCountFinal = %d\n",
                      EventSet.GetRecordCount(),
                      rStatus.m_lCurrentRecord,
                      rStatus.m_bRecordCountFinal);
              
               EventSet.Edit();
               EventSet.m_Time += newStartTime - m_oldStartTime;
               VERIFY(EventSet.Update());
              
               EventSet.MoveNext();
        }
       
        EventSet.GetStatus(rStatus);
        TRACE("5:     GetRecordCount() = %d,rStatus.m_lCurrentRecord = %d,rStatus.m_bRecordCountFinal = %d\n",
               EventSet.GetRecordCount(),
               rStatus.m_lCurrentRecord,
               rStatus.m_bRecordCountFinal);
        TRACE("-----------------------------------------\n");            
 
返回结果:
-----------------------------------------
1:      GetRecordCount() = 1
2:      GetRecordCount() = 1
3:      GetRecordCount() = 1
4:      GetRecordCount() = 1,rStatus.m_lCurrentRecord = 0,rStatus.m_bRecordCountFinal = 0
4:      GetRecordCount() = 2,rStatus.m_lCurrentRecord = 1,rStatus.m_bRecordCountFinal = 0
4:      GetRecordCount() = 3,rStatus.m_lCurrentRecord = 2,rStatus.m_bRecordCountFinal = 0
4:      GetRecordCount() = 4,rStatus.m_lCurrentRecord = 3,rStatus.m_bRecordCountFinal = 0
5:      GetRecordCount() = 4,rStatus.m_lCurrentRecord = 3,rStatus.m_bRecordCountFinal = 1
-----------------------------------------
 






CRecordSet数据表的批量修改


if (newStartTime != m_oldStartTime)
{
 CEegEvent EventSet;
 EventSet.m_strFilter.Format("PatientID=%d AND SegmentID=%d",
m_oldPatientID,m_pEegSet->m_SegmentID);
 EventSet.m_strSort = "";
 EventSet.Open();
 
 while(!EventSet.IsEOF())
 {
 //逐条编辑
  EventSet.Edit();
  EventSet.m_Time += newStartTime - m_oldStartTime;
  VERIFY(EventSet.Update());
  
  EventSet.MoveNext();

 
/*
经试验,下面的语句可以把更新刷回数据库(可能是内存的也可以是物理的),这样另一个同类型的实体访问此表将可以读取到已经更改后的表格内容。
如果不使用该句,另一个同类型的实体立即访问该表得到的结果可能还是旧的,但如果延迟一会儿访问,大概数据库内部有一个超时更新装置,时间到后可自动更新数据库,所以那个实体延迟访问的结果将可能就变正确了。
为了避免这种不确定性,数据修改后应该加上Requery()。
*/
  EventSet.Requery();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值