MFC SQL SERVER数据库ODBC编程体会

来源:互联网 发布:上淘宝网看女装 编辑:程序博客网 时间:2024/06/01 13:12

首先声明,这个文章是我自己写的。这是报告里的总结部分,希望把自己的一些经验和大家分享一下。整个报告连同程序在我的资源里面都已经上传了,有兴趣的同学可以自行下载。隔了好久想想还是把这个发上来吧。。。 

 


本次实习,学到很多的东西。

1.知识方面

      LISTctrl,属性里view选项选择report以展示数据库中的数据。

      cdatabase 的对象,Open函数第四个参数“odbc;”,是分号不是冒号,如若有密码,则需要在此参数里有说明。

      Sql server2008里的数据类型,有的后面有个括号。括号中的内容是数据的大小范围,如果所输入的数据超过了这个范围,可能在数据录入db时就不允许操作(db中的int型),也可能在数据录入时并不报错(dbnchar(10)),甚至在SQLSMS里用SQL语句查询没问题,但是当VC与之连接时,所查内容就会缺失。

     sql 数据类型:

bigINT可以表示不含尾数为X182代身份证号,学号等;

-9,223,372,036,854,775,8089,223,372,036,854,775,807263次)

Int:从-2,147,483,6482,147,483,648231次)

SmallInt:从-32,76832,767215次)可以保存教师工作证号

TinyInt: 从0255。可以保存分数

对于BigInt来说每条记录占据8个字节,而Int只使用两个字节,且只接收预期大小,避免缓冲溢出。对于不同的数据类型,要综合考虑,数据的大小和表示范围问题。

      d.open()不能用内联函数来实现,一个完整的数据库操作需要在同一个函数内实现。

      在编写SQL命令时,注意在末尾加点空格“ ”如涉及多条件查询,编写相应的SQL语句命令时,常常用到CString+=操作符,如果上一个CString对象和下一个相加时中间没有空格,就有可能出现 “fromwhere”这样的情况导致系统无法辨认关键字,以致出现错误。笔者在调试的过程中深受其害,浪费了很多时间,这也就同样的提醒了我们,任何时候都要注意细节。

      CString INT 使用_ttoi()函数

      类在继承过程中,总的过程函数不可以实例化,需要实例化的只是细节函数,如果要实例化过程函数,需要在每个派生类中都实例化过程函数

      每个对话框对应一个类,在登陆后需要进行信息的传递,在DOMODAL()的之前要进行信息的传递

      继承派生的细节错误:在基类的对话框中调用派生类的对象,把基类的私有成员赋给派生类从基类继承过来的函数中,并将之作为实参。不可行。错误原因:基类的私有成员对派生类不可见。

      对于SQL语句的深入学习,一些内链接等语句的实践。

2.系统优化

笔者在写代码的时候同步地记录一些想到的优化的问题。其中有的已经被优化,有的还没有被优化。各位同行如果有兴趣可以进行优化,如有想到什么可以优化的方面也可以联系我。所有我想到的可优化方面在这里列出。

       state使用枚举类型。对多条件查询语句判断用户输入的情况,我使用了一个JUDGE()函数。State表示一个用户输入状态。他可以使用一个枚举类型。

       一些提示方面MESSAGEBOX的优化:查询提示:无符合的项目。选课:弹出是否确认选择该项的MESSAGEBOX

       点2下会提示连接正在被使用。(猜测是d.close()的问题)

       鼠标点击控件进行选择操作。需要使用消息响应,通过点击相应的项来选择,并进行数据的更新和查询。

        登陆界面:通过控件选择身份S/T/A来筛选身份,减少数据库负担,顺便对应不同的对话框。

        插入功能和删除功能的多条件选择功能。

        选课日期限制。

       登陆判断。

       S QL 08BUG可能是我的SQL版本问题,在处理生日数据类型的时候原来使用的是DATE类型,而显示上面最后一位会遗漏。我同学则没有这方面的问题。于是我使用了DTAETIME类型,虽然有较多无用星信息,但是保证了数据的完整。

        查询不分大小写,自动按照学号排序:这些似乎都是SQL默认的东西,我觉得大小写这个可以有所区分,而学号排序他是按照学号来排序的,也是一个可以自己想想办法优化的方面。

3.个人体会

   首先,最大的喜悦还是做成一个系统的成就感。一开始,由于对相关控件和需要实现的功能不熟悉,我先花了几天做了一个学生界面实现了一部分功能,在对整体有一个相对的了解后,开始进行整体的架构。架构的过程比较艰难,需要站在整个系统全局的高度上看问题,需要看到哪些功能是共性的,哪些功能是个性的,需要对很多共性的功能进行抽象,写出相应的虚函数,我把这部分内容写在一个WORD文档里面,我在这一块的过程中大概花了2天。我也听到有同学在最后做完的时候进行吐槽,说终于做完了,为了解决权限问题我多做了好多个对话框。我觉得在这个过程中,他应该是缺少了分析问题的这个过程,而我在这一块中,就有一个整个系统架构的过程。很多细节问题都要先想明白,而不是一味地从头写到尾。有思考,才能有成长。我觉得站在一定高度看问题这件事情很爽,分析每一个环节需要什么功能,分析后把相关功能进行合并和扩展,虽然很累,但是做的津津有味。


其次应该是对于C++的更深刻的理解。早在学C++的时候就经常要说四个词语,其实学的时候大家并不一定了解:封装继承重载多态。这是他的特点。我在做这个教务管理系统的过程中,在抽象共性功能的过程中,在对话框的使用中用到了继承机制。我逐渐理解了其中的奥妙,觉得这种机制真是了不起,大为赞叹。也正是这方面的原因,我因为这次课程设计,渐渐爱上了这种对函数抽象的过程,爱上了C++,所以我能够在课程设计期间,除了必要的休息、上课还有课程设计时间,几乎把所有时间都放在了写程序上面而反以为乐。我觉得这是一件我喜欢做的事情,而在当时那个时间点没有什么比他更重要。


然后是界面与功能的问题。我逐渐形成了一种观念。我认为功能是整个系统的灵魂,那才是实实在在的阵阵有用的东西。倒不是说不要做界面,只是在把功能做好做全的前提下,若还有时间可以去美化一下界面。功能是需要不断优化和改善的,这本身需要很多时间,可我们的实习是没有那么多时间的。即使我把所有课余时间都在写代码,到实习结束时我也没有把我想做的功能全部实现。一方面也是我想的东西比较多,另外一方面也是说明了功能的实现和优化本身需要很多时间。我觉得有些同学界面的确做得很漂亮,但是没有很强大的功能,那也是没有用的。因为对于用户来说,这是不实用的。


接着说说看学和用的关系吧。不论C++还是数据结构还是这回的数据库的课程设计,正如一个同学说的那样,我觉得只要认真做就肯定能有收获。也许你收获的不是老师或者本次实习想要告诉你或者最应该教会你的,但是你肯定学会了。学了东西就是要用的,不然马上很快就会忘记。这就是学以致用的道理所在。像MFC的一些东西其实以前并不是特别熟悉的,这次课程设计的过程中也就慢慢熟悉和深入学习了LISTCTRL的一些使用。书上讲了很多理论性的东西,是系统地讲解C++,但是有些比较实用的东西毕竟还是要靠自己领悟的,正所谓实践是检验认识真理性的唯一标准,只有实践过了才会深刻理解。


最后自然还是谈谈遇到问题的情况。其实对于程序员来说,这种情况很正常呢,写代码不遇到问题才是不正常的。每次实习的时候都有非常高兴和非常痛苦的时候,痛苦的时候基本上就是问题找不到的时候。这次实习,我更加深入地学会用断点去查错误,看每一个变量的值到底哪个有问题,并且使用VS2010的调试功能的时候越来越得心应手了。遇到问题本身并不可怕,可怕的是找不到错在哪里。编程的过程其实和生活中的一些哲学有着道相通的地方:对每个人来说,犯错不可怕,没人会一直正确,但是犯错之后要吸取教训,有所收获,这才是最重要的。同样的,在学习和深入理解一门学科时,这种悟相通之道的过程,这种类比的思想才是最重要的。