医学生“程序设计”课程教学中若干问题讨论
2010-09-12刘萍,何青
刘 萍,何 青
(桂林医学院信息中心计算机教研室,广西 桂林 541004)
医学生“程序设计”课程教学中若干问题讨论
刘 萍,何 青
(桂林医学院信息中心计算机教研室,广西 桂林 541004)
由于医学生与工科计算机专业学生逻辑思维上的差异,程序设计对于医学生而言,是较难学习的一门课程,在教学中常常会遇到一些难于理解的问题,使学生难于准确掌握及正确使用。本文总结教学中出现的若干问题,着重讨论了空值Null、BOF和 EOF属性以及聚合函数的特点及在程序中的正确使用和教学方法。
医学生程序设计教学;空值Null、BOF、EOF属性;聚合函数;探讨
引 言
VisualBasic forApplications(简称VBA)是新一代标准宏语言,是基于 Visual Basic forW indows发展而来的。VBA提供了面向对象的程序设计方法及相当完整的程序设计语言,对于非计算机专业的医学生来说易于学习和掌握。因此,对于日后在工作中需要经常使用Office套装软件来解决工作中需要解决的问题的医学大学生,学习VBA程序设计将有助于使工作自动化,提高工作效率。
所以,从目前高校数据库课程开设的情况来看,大部分学校都将 Access数据库系统作为非计算机专业学生学习的课程之一,同时Access近年来也成为全国高校计算机二级等级考试参考人数最多的科目之一。为此,我们教研室也为医学生开设了“Access数据库VBA程序设计”这门选修课。由于医学生与工科计算机专业学生逻辑思维上的差异,如何提高该课程的教学质量和教学效果,是我们任课教师一直探讨的问题。由于VBA不是一门独立的编程语言,是基于VB扩展而来的,它在语法规则上基本遵循VB的语法,但基于 Access数据库的使用特点,在个别使用上又有其特点。
1 空值Null、Empty、和Nothing
在VBA中,Null、Empty、和Nothing表示的都是空值,但它们又有所区别。Nothing:是用于对象变量的,当对象变量被设为 Nothing(set rs=Nothing)时,系统便会释放该对象所占用的内存资源,此时该对象变量指向空对象。Empty:表示的是一个有效空值,当一个变量 x被声明为变体类型而从未赋值时,其值就是 Empty,是由系统自动赋予的,表示变量 x尚未初始化,此时的 x的值可以是数值型的初始值 0,也可以是字符型的初始值空字串"",此时语句 If x=0 Then或 if x=""Then或 If IsEmpty(x) Then的判断结果都为 True。Null:表示的是一个无效数据,一般用于表示记录中某字段数据暂不确定时的数据值,比如,在通过程序添加记录时,对于某个字段的值暂不确定,就可以用Null来表示。在程序中当 x=Null时,则表示 x不包含有效数据,此时的 x的值不能在程序中直接使用。对于值为 Null的数据只能通过 IsNull()函数来判断,例如:IF Is-Null(x)=true Then,而不能用 If x=Null Then,因为含有 Null值的运算式其结果永远是Null。
空值Null虽然不能在程序中直接使用,但它却是完全合法的数据库录入项,我们在编程时不能因为空值Null是无效数据,在数据录入时就一律拒绝空值,如果完全回避空值,那么,在你创建一条记录时,如果某个字段的数据暂时不确定,就无法创建该记录。要求所有数据都必须是已知的,在实际使用当中是不现实的。以医院急诊室的数据库系统为例,不能因为数据录入时不确定一个急诊病人的年龄,系统就拒绝为其创建一条记录。所以,我们不能完全回避空值,而应在实际应用中正确认识及合理使用空值。
在教学中,发现学生对 Null空值较难理解,可通过一些实例讲解使学生加深对空值的理解。例如:在盘点药品库存时,发现某种药品用完了,那么在它的数量一栏里我们应该输入 0,代表这种药品已盘点过,数量是 0,而另一种药品我们还没来得及清点,数量暂时未知,那么此时它的数量一栏是空的,也就是我们所说的空值Null,这种空值告诉我们该药品的盘点工作尚未完成,数量暂不确定。通过0和Null的实例比较,我们可以很清楚地看到,0和Null反应的是事物的两种完全不同的状态。从而进一步加深了对空值Null的正确认知,并认识到空值是无法避免的,正确的做法就是如何正确处理它们,确保它们不会导致程序错误。当空值在表达式中使用之前,可以用 IsNull函数捕捉空值或用Nz函数来处理空值,因为空值经常会返回错误而使程序无法正常运行。
2 if语句的条件表达式中出现Null值的运行情况
前面讨论的Null值不能在程序中直接使用,否则程序会返回出错信息而使程序无法正常运行。但当Null出现在 IF语句的条件表达式中时,程序不会返回错误信息,并且可运行,只是运行结果不正确。例如下面的程序段,学生在编程时,由于对于未初始化的文本框控件的Value属性初始值为Null这一特征的掌握不准确,时常会误用其空值Null:
IfMe.账号="" Or Me.密码="" Then MsgBox"账号、密码不能为空"
ElseIfMe.账号 <>"1234567"Then
MsgBox"账号错误,请重新输入"
ElseIfMe.密码 <>"gyjsj"Then
MsgBox"密码错误,请重新输入"
Else
MsgBox"登录成功!"
:
:
End If
在程序首次运行时,如果“账号”和“密码”文本框不输入任何数据 (即未初始化),此时引用“账号”、“密码”文本框的Value属性为空值 Null,程序运行时不是像程序设计者预想的那样,执行MsgBox“账号、密码不能为空”语句,也不执行MsgBox“账号错误,请重新输入”和MsgBox“密码错误,请重新输入”语句,同时又不返回错误使用Null值的信息,而是执行MsgBox“登录成功!”语句(此时 if语句的前 3个分支都出现了 Null空值)。虽然教科书明确指出不能在程序中直接使用空值Null,可问题出现,老师应给学生一个合理的解释。那么程序对于条件表达式出现空值 Null的情况是如何判断的呢?通过查证Access帮助信息提示是判为 False,假设 判 断 为 False,则 Not(Me.账 号 = ""OrMe.密码 ="")=True应该成立,实际运行情况表明该假设不成立,程序执行结果仍是运行MsgBox“登录成功!”。由此可见,程序对于条件表达式出现空值Null的情况是既不返回错误信息,也不判断为 False。即,不做任何逻辑判断,而是忽略跳过所有含Null值的条件分支,转入后续分支判断执行。由于 Null出现在 If语句中程序可运行而系统又不提示出错信息,使学生误用后很难发现错误。所以在教学中,应通过实例详细阐述 Null的特点、正确使用及合理规避,可通过对文本框初始化的方法尽量避免使用 Null空值。也可把第一条语句改为:IF Nz(Me.账号)=""Or Nz(Me.密码)= ""Then或 IF Is Null(Me.账号)=True or IsNull (Me.密码)=True Then。
3 SQL select avg()…查询结果集的特性及使用
在VBA的ADO数据库操作程序中,经常会用到 SQL select查询语句,下面有两个查询语句:
Select姓名,年龄 from tEmp where党员否Select avg(年龄)from tEmp where党员否
第一条语句的查询结果是党员的姓名,年龄字段数据集,如果没有党员记录,则查询结果集为 0条记录。而第二条语句的查询结果是党员的平均年龄,即查询结果是一个集函数返回值,其特点是:无论是否有党员记录,结果集中都会有一条固定的记录,(该结论可通过在程序中添加语句:MsgBox rs.RecordCount得到验证),只是记录的值不同。当有党员记录时,集函数返回值为一个有效的确定值,而当无党员记录时,集函数返回值为一个无效的空值Null。下面的程序段是全国计算机二级等级考试的一道程序题:
Private Sub bt_Click()
Dim cn AsNew ADODB.Connection
Dim rsAsNew ADODB.Recordset
Dim strSQL As String
Dim sage As Single
Set cn=CurrentProject.Connection
strSQL="select avg(年龄)from tEmp where党员否"
rs.Open strSQL,cn,adOpenKeyset,adLock-Optimistic
If rs.EOF Then
MsgBox"无党员职工的年龄数据"
sage=0
Exit Sub
Else
sage=rs.Fields(0)
Me.Text1=sage
End If
:
:
End Sub
在判断查询结果集中是否有党员平均年龄时,程序使用的方法是用记录集的 EOF属性,该属性当记录集中无记录时,rs.EOF=TRUE,此方法用于判断普通字段数据查询结果集是可以的,但该题判断的结果集是一个集函数返回值,无论党员条件是否为真都会有一条固定的记录,既然有记录,那么其rs.EOF=FALSE。所以当模拟无党员记录运行该程序时,程序并未按设计者的想法运行MsgBox"无党员职工的年龄数据"语句,而是运行 sage= rs.Fields(0),同时提示错误信息:
因为此时查询结果集中的 rs.Fields(0)的值为Null。所以该程序不适合用 rs.EOF来判断。
解决方法:可以利用查询结果集中固定记录的值的不同来作为判断条件。为避免使用无效空值Null,可使用 Is Null()函数来判断空值,或者用Nz()函数将无效空值 Null转换为有效值,可将程序改为:
MsgBox"无党员职工的年龄数据"
sage=0
Exit Sub
Else
sage=rs.Fields(0)
Me.Text1=sage
End If
:
:
End sub
此时,无论是否有党员记录,程序都能正常运行了。
结束语
程序设计对于非计算机专业的医学生来说,是较难学习和掌握的一门课程,学习中常常会遇到一些难以理解和掌握的知识点,而有限的教科书又无从查证,甚至一些辅助教材还会出现一些错误内容,这就需要我们老师去深入探讨及结合实验验证来给学生作详细的讲解,从而使学生能正确认知和使用。在以后的教学中还会遇到很多类似的问题需要我们进一步的不断探讨。
[1] 王 晟,韩泽坤.Access数据库开发经典案例解析[M].北京:清华大学出版社,2006.336-380
[2] 蒋加伏,张林峰.VisualBasic程序设计教程[M].北京:北京邮电大学出版社,2004.312-316
[3] 何胜利.Access数据库应用技术教程[M].北京:中国铁道出版社,2008.182-232
[4] 教育部考试中心.全国计算机等级考试二级教程—Access数据库程序设计[M].北京:高等教育出版社,2004.247-293
(学术编辑:周 敏)
1005-3697(2010)05-0506-03
G642.4
B
2010-07-01