void CSuper_View::OnMtoG() 
{
// TODO: Add your control notification handler code here
CDaoDatabase* temp_db = new CDaoDatabase();
//打开数据库
try
{
temp_db->Open(_T("D:\\visual c++\\Super\\Super.mdb"));
}
catch(CDaoException* e)
{
AfxMessageBox(e->m_pErrorInfo->m_strDescription);
temp_db->Close();
e->Delete();
return;
}
//CDaoRecordset复用CDaoDatabase对象
m_qSet.m_pDatabase=temp_db;
//打开记录集Management
if(m_qSet.IsOpen())
m_qSet.Close();
try
{
m_qSet.Open();
}
catch(CDaoException* e)
{
AfxMessageBox(e->m_pErrorInfo->m_strDescription);
m_qSet.Close();
e->Delete();
return;
}
if(!m_nSet.IsBOF())
{
m_nSet.MoveFirst();
    while(!m_nSet.IsEOF())
    m_nSet.MoveNext();
    temp_NO=m_nSet.GetRecordCount()+1;
}
else
temp_NO=1;
......
m_qSet.m_pDatabase=temp_db
temp_db->Close();
delete temp_db;
m_pSet->Close();
}
......处为记录集处理。
Q1:请问本身这段代码有什么问题?
Q2:在程序第二次执行本段代码时,m_qSet->IsBOF()返回值却为1(理论应该为0),不知是何原因?
Q3:当我将CDaoDatabase* temp_db改为CDaoDatabase temp_db(其他部分也相应改动)后就没有此问题。我想问的是这里用CDaoDatabase*还CDaoDatabase哪个更合理?

解决方案 »

  1.   

    1、数据库是局部变量,那么数据集定义成类成员变量似乎没有必要;
    2、关闭时,先关闭数据集,再关闭数据库(此步可省),再删除数据库指针,如果你先删除数据库指针,那么数据集就已经关闭,如果再关闭数据集,可能会出错,这可能是你出错的原因,你的数据库不用指针的时候,就不用删除指针,也就没有关闭数据库,你最后调用m_pSet->Close();就没有问题;
    3、你这里有两个数据集变量m_pSet、m_nSet,是写帖子的时候写错了,还是本来就有两个?如果本来就有两个,你第二次调用时,当然就有可能出现你说的问题
      

  2.   

    谢谢fengqinggao(风清高) 
    m_pSet、m_nSet是两个数据集变量,但打开的是不同的数据库。至于关闭的顺序也是和你说的是一样的,并没有先删除数据库指针,再关闭数据集。
      

  3.   

    噢,刚才才看清楚,你这里有三个数据集:m_pSet、m_qSet、m_nSet,不好意思那你的m_qSet->IsBOF()语句在哪儿啊?从你的代码里好像看不出什么问题
      

  4.   

    还有,你的倒数第四行语句:m_qSet.m_pDatabase=temp_db
    没有什么用啊,因为紧接着的这句:temp_db->Close();马上把数据库关闭了,m_qSet数据集也就无效了
      

  5.   

    中间有很多代码省略了!!
    我自己已经找到原因了!是因为m_strFilter参数化后,在记录集关闭前没有清零。第二次打开该记录集时导致IsBOF()为0
    不过还是很感谢你!!不知