这几天写MFC时候碰到的一些问题!

     按照老师的要求,期末必须交一次大作业!这次C++的大作业,其实也就是课程设计是用C++ MFC写一个学籍管理系统。虽然听人家说C++ MFC已经被淘汰了,但是按照要求还是得去写呗,况且都是面向对象的语言可能对我的java学习也会有点帮助的!但是还是不的不吐槽下VC++ 6.0这款编译器!是在是太糟糕了,出错了什么都不提示,就一个错误框给你,所以你不得不去调试看下再哪步出错,然后在这步去找哪里错了!况且我对debug用的也不怎么熟悉所以只能用注释和MessageBox来调试了!而且有的时候会莫名的出现错误,过会又好了,类名什么的在类视图中有的时候又找不到等等的一些问题,真是太浪费时间了。很不好,中间也有尝试去用VS2010,但是确实很卡,后来也就放弃了!但是呢在写代码的过程中还是有一点收获的!下面就把这些收获记录下来,供以后学习参考!

    1.出现语法错误

   我在一个类中定义了一个方法

int ADO:: GetRecordCount(){
     int nCount = 0;
     try{
	      m_pRecordset->MoveFirst();
	 }
     catch(_com_error e){
		 AfxMessageBox(e.Description());
         return 0;
	 }
	 while(!(m_pRecordset->adoEOF)){
	 m_pRecordset->MoveNext();
	 nCount = nCount+1;
	 }
	 m_pRecordset->MoveFirst();
	 return nCount;


}

  然后在其他类中调用这个方法循环输出结果集的数据

for(int k=0;k<ado.GetRecordCount();k++){
		    value = ado.m_pRecordset->GetCollect(_variant_t((long)0));
			if(value != m_information)
				count++;
			else{
				break;
			}
          ado.m_pRecordset->MoveNext();
}

  结果就出现输出的数据一直是结果集的第一行数据。后来才发现k<ado.GetRecordCount()里面的ado.GetRecordCount(),每次循环判断条件的时候都会运行,而子啊这个方法里面最后一句是m_pRecordset->MoveFirst();把结果集移到第一行!所以就会发生上面的情况!

     解决办法:

        1.在循环体外面定义一个int变量来接受行数,然后写进判断条件。

        2.直接用while(!(ado.m_pRecordset->adoEOF))也就是判断结果集是否到了最后来控制!

    2.语法错误

      If判断语句和循环语句的误用导致结果出错。比如说while(!(ado.m_pRecordset->adoEOF)),这里把while换成if就会导致方法体值运行一次!切记切记,不要粗心,主要还是自己开发的太少了,要多练多练!

      过程中暴露出来的问题

      1.对SQL语句还不是很了解,所以对一些表的处理,数据的筛选还不是很合理!在期间学会了group by和ORDER BY语句有的了运用但是对group by还不是很熟悉。这里可以参考http://www.w3school.com.cn/sql/sql_groupby.asphttp://www.w3school.com.cn/sql/sql_orderby.asp里面的信息!

      2.对数据库的处理很不理想!对表的参照完整性一点概念都没有!对事务处理什么的不了解!以后需要在这方面的了解!

      3.对面向对象语言的3大特性封装,继承,多态。在开发的时候没有很好的体现!所以在开发过程中会发现代码的重用性很高!需要加强!

      4.可能是自己的方法不对,在开发过程中会出现逻辑稍复杂的语句!(循环里面套循环),因为自己对算法这些的不是很了解,所以可能会觉得有点繁琐!有时间可以抽空看下算法!

     哎~~转眼到大四了,时间真的不够!以前实在是玩的太疯了!要努力要努力!

       

原文地址:https://www.cnblogs.com/iMouseWu/p/3175967.html