试题库管理系统开发心得.doc
试题库管理系统开发心得陈 明(怀化培训基地信息教研室 邮编:418000)摘要教考分离不失为提高职工培训教学质量的一种有效手段,试题库的建立又是教考分离实施的前提,本文就试题库平台的开发的难点提供关键代码。关键词格式文本存储 随机抽题面向对象正 文2009年我担任(试题库管理系统)的负责人,主要负责平台开发,试题库管理系统基本要求为:能随机对题库各种题型抽题生成试卷,同时能面向对象进行修改,基于本人的认知水平及时下网络技术的流行,我选择了VF+SQL模式,以便达到共享数据库,多机同时录入的效果。系统平台的开发难点主要在于(1)VF向SQL存储图片及格式文本,(2)随机抽题,(3)生成能面向对象进行修改的试卷即VF控制WORD. 本系统于9月初研发完,经10、11月调试修改即将投入使用,本人在开发运用软件之路上的艰辛和快乐,体现在下列程序代码之中。现将部分程序代码呈现给广铁的同行,希望能对各位的程序开发有所帮助。一、VF向SQL存储图片及格式文本IF EMPTY(thisform.edit1.Value) mand4.Visible= .F. =MESSAGEBOX("试题添加失败,没有题目!",0+48,"提示") RETURNelse nHandle=GetConnHandle()lIsRight=.T.IF nHandle>0=SQLSETPROP(nHandle,"Asynchronous",.F.) &&设置为同步连接 =SQLSETPROP(nHandle,"Transactions",2) &&开始人工事务处理aa=ALLTRIM(Tbo2.Value)ff=ALLTRIM(Tbo1.Value)ictxtfile=Thisform.edit1.ValueSTRTOFILE(ictxtfile,"c:playerhelp.txt") lcTextString=Strconv(Filetostr('c:playerhelp.txt'),13)DO CASE CASE EMPTY(thisform.TEXT2.Value) lcTextString1=thisform.text2.Value a=MESSAGEBOX('本题无图片,单击"是"将添加试题入库,单击"否"将取消本题入库!',32+4,'系统提示') IF a=6 cSQLString="INSERT INTO tbltk (km,lx,tm,tp) VALUES ('&aa','&ff',?lcTextString,'')" ELSE RETURN endif OTHERWISE lcTextString1=thisform.text2.Value lcTextString2=Filetostr('&lcTextString1')+chr(0) cSQLString="INSERT INTO tbltk (km,lx,tm,tp) VALUES ('&aa','&ff',?lcTextString,?lcTextString2)" ENDCASE nResult=SQLEXEC(nHandle,cSQLString) IF lIsRight=.T. =SQLCOMMIT(nHandle) WAIT WINDOW "试题加添成功!" NOWAIT TIMEOUT 2 thisform.edit1.Value='' thisform.text2.Value='' ELSE =SQLROLLBACK(nHandle) =MESSAGEBOX("试题添加失败,请重新执行!",0+48,"提示") ENDIF =SQLSETPROP(nHandle,"Transactions",1) &&结束人工事务处理 ENDIF ENDIF二、随机抽题nHandle=GetConnHandle()IF nHandle>0 cString="SELECT * FROM tbltk where tbltk.km='&dd'and tbltk.lx='选择题'" cString1="SELECT * FROM tbltk where tbltk.km=''" nResult=SQLEXEC(nHandle,cString,"curtk") nResult=SQLEXEC(nHandle,cString1,"curtk1") IF nResult<=0 =MESSAGEBOX("读取题库信息发生错误,请重新登录!",0+48,"提示") RETURN ENDIF SELECT curtkCOUNT TO nDime b(g1),c(4)B(1)=int(n*Rand(-1)+1) i=2do while i<=g1t=1 a=int(n*Rand()+1)j=1do while j<=i-1 if a=b(j)t=-1exitelsej=j+1endifenddoif t=-1 loopelseB(i)=a endifi=i+1enddoFOR i=1 TO g1SELECT curtkd=b(i)GO dx=curtk.kmx1=curtk.lxx2=curtk.tmx3=curtk.tpSELECT curtk1INSERT INTO curtk1 (km,lx,tm,tp) VALUES (x,x1,x2,x3) ENDFOR ELSE ENDIF三、生成能面向对象进行修改的试卷即VF控制WORD.OleWord=createobject('word.application') OleWord.visible=.t. OleWord.Documents.Open ('d:ksmb1.doc') OleWord.Selection.Font.Size=16 OleWord.Selection.Font.Name="黑体" OleWord.selection.ParagraphFormat.LineSpacing=21 OleWord.Selection.TypeText("&c1") OleWord.Selection.ParagraphFormat.Alignment =1 OleWord.Selection.TypeParagraph s="" ff=""+"&dd"+"" cc="&c2"+"&s"+"&c3"+"学年"+"第"+"&h"+"学期"+"&ff"+"&g"+"考试试卷" OleWord.Selection.TypeText("&cc") OleWord.Selection.TypeParagraph OleWord.Selection.Font.Size=14 OleWord.Selection.TypeText(" 总分_") OleWord.Selection.TypeParagraph select curtk1j=RECCOUNT() OleWord.Selection.Font.Size = 14OleWord.Selection.ParagraphFormat.Alignment =0xx=ALLTRIM(Thisform.text5.Value)y=ALLTRIM(Thisform.text14.Value)yy="&th"+"、"+"选择题"yy1="("+"每小题"+"&xx"+"分,共"+"&y"+"分"+")"OleWord.Selection.Font.Name="黑体" OleWord.Selection.TypeText("&yy")OleWord.Selection.Font.Name="宋体" OleWord.Selection.TypeText("&yy1")OleWord.Selection.TypeParagraphFOR i=1 TO jgo ireplace curtk1.tm WITH STRCONV(curtk1.tm,14) SET SAFETY OFFa=ALLTRIM(STR(i)+"."+"bmp"OleWord.Selection.TypeText(alltrim(str(i)+"."+curtk1.tm)DO CASECASE LEN(CURTK1.TP)=0OTHERWISEStrtofile(LEFT(curtk1.tp,LEN(curtk1.tp)-1),"c:&a")OleWord.Selection.TypeParagraphOleWord.Selection.inlineshapes.addpicture("c:&a")ENDCASEOleWord.Selection.TypeParagraphENDFOROTHERWISEENDCASE虽然软件运行平稳,但任有客户端需安装的麻烦之嫌,如用JSP也许更好.在此一并感谢基地领导及合作的同仁. 责任编辑:苏志刚