注册 登录
编程论坛 VC++/MFC

请教mfc高手,ODBC数据库编程记录移动只能移动一条,详细如下

月光疾風 发布于 2012-12-08 22:33, 500 次点击
最近刚学MFC课程设计需要准备做一个图书馆管理系统,在通过界面上的按钮进行浏览表单里的记录时单击第一次记录能下移一条,再单击第二次它就不移动了,不变了,单击上一条也是一样,翻阅很多资料未能解决,求解大神指点迷津,先谢谢了
这个是界面截图
只有本站会员才能查看附件,请 登录


这是我数据库表单的内容
只有本站会员才能查看附件,请 登录


下面这段是命令按钮“上一条”的代码

//上一条按钮消息映射函数
void CBookMDlg::OnPrior()
{
    //CBookDataSet派生自RecordSet类
    CBookDataSet m_rsDataSet;//声明一个记录集对象

    //判断记录集是否打开,若打开则关闭
    if(m_rsDataSet.IsOpen())
    {
        m_rsDataSet.Close();
    }
   
    m_rsDataSet.Open();            //打开记录集

    if(!m_rsDataSet.IsEOF())    //判断是否到达记录集的结尾
    {
        m_rsDataSet.MovePrev();    //指针移动到上一条记录

        //数据库更新到控件关联变量
        m_strBOOKNAME=m_rsDataSet.m_BOOKNAME;    //书名
        m_strBOOKID=m_rsDataSet.m_BOOKID;        //书籍条码
        m_strAUTHOR=m_rsDataSet.m_AUTHOR;        //作者
        m_strPRESS=m_rsDataSet.m_PRESS;            //出版社
        m_strPRESSDATE=m_rsDataSet.m_PRESSDATE;    //出版日期
        m_strFLAG=m_rsDataSet.m_FLAG;            //借阅信息

        UpdateData(FALSE);//数据更新到控件
    }
    m_rsDataSet.Close();//操作完成关闭记录集   
}
7 回复
#2
月光疾風2012-12-08 22:47
回复 楼主 月光疾風
比较急,各位大神帮忙看看,自己再顶下,真心感谢~
#3
crystall2012-12-10 10:04
程序代码:
//单击状态
int g_nClickState = 0;

void CBookMDlg::OnClick()
{
    CBookDataSet m_rsDataSet;
   
    if(m_rsDataSet.IsOpen())
    {
        m_rsDataSet.Close();
    }
   
    if(!m_rsDataSet.IsEoF())
    {
        //第一次单击,移动到下一条
        if(g_nClickState == 0)
        {
            g_nClickState = 1;

            m_rsDataSet.MoveNext();
           
            UpdateData(FALSE);
        }
        else
        {
            //第二次单击
            g_nClickState = 0;
        }
    }
   
    m_rsDataSet.Close();
}
#4
月光疾風2012-12-10 13:26
回复 2楼 月光疾風
你好,我试过了你的代码,还是不行,发现一个问题,如果我一次连续调用两个m_rsDataSet.MoveNext()函数将记录就会下移两个,但是貌似单击按钮还是只能触发一次,按第二次就没反应了,是不是还跟m_rsDataSet.Open()这个成员函数的参数有关系,谢谢了~
    CBookDataSet m_rsDataSet;
   
    if(m_rsDataSet.IsOpen())
    {
        m_rsDataSet.Close();
    }
   
    m_rsDataSet.Open();//打开记录集
    if(!m_rsDataSet.IsEOF())
    {
        //第一次单击,移动到下一条
        if(g_nClickState == 0)
        {
            g_nClickState = 1;

            m_rsDataSet.MoveNext();//移动两次
            m_rsDataSet.MoveNext();

            //数据库更新到控件关联变量
            m_strBOOKNAME=m_rsDataSet.m_BOOKNAME;//书名
            m_strBOOKID=m_rsDataSet.m_BOOKID;//书籍条码
            m_strAUTHOR=m_rsDataSet.m_AUTHOR;//作者
            m_strPRESS=m_rsDataSet.m_PRESS;//出版社
            m_strPRESSDATE=m_rsDataSet.m_PRESSDATE;//出版日期
            m_strFLAG=m_rsDataSet.m_FLAG;//借阅信息

            UpdateData(FALSE);//数据更新到控件
        }
        else
        {
            //第二次单击
            g_nClickState = 0;
        }
    }
    m_rsDataSet.Close();
#5
月光疾風2012-12-10 13:55
回复 3楼 crystall
你好,我知道是什么问题了,因为每次单击的时候我都调用了OPEN()成员函数的关系,估计就跟初始化一样,每次单击都初始化,就出现了只能移动一条记录的现象,不过现在又有个问题需要请教下,怎么在程序初始化开始的时候打开数据库记录集,这样我就可以不用通过对象来访问OPEN()成员函数了,非常感谢
#6
crystall2012-12-11 10:11
貌似必须通过对象来访问哦
你试试把CBookDataSet m_rsDataSet 临时变量,改为成员变量。
然后在构造的时候,调用open()。
在析构的时候,调用close()。
这样就只打开一次,关闭一次。
我不知道这样可行不?
#7
月光疾風2012-12-11 12:54
回复 6楼 crystall
多谢提醒,之前没想到定义为成员变量,应该是可行,晚上试一下,真心感谢~
#8
crystall2012-12-11 14:37
回复 7楼 月光疾風
不谢
1