//根据用户的时间,做出相应的反映 |
public void actionPerformed(ActionEvent e) { |
String str = e.getActionCommand(); |
//清空结果显示区中的内容,如果有的话。 |
if ( "查询" .trim().equals(str)) { |
int k = 1 ; |
while (k < 10 ) { |
for ( int i = 1 ; i < 7 ; i++) { |
jtSearch.setValueAt( null , k - 1 , i - 1 ); |
} |
k++; |
} |
//调用下面的这个方法,在数据库中进行查找,并将结果显示在表格中。 |
searchAvailableCourse(); |
} else if ( "提交" .equals(str)) { |
//processBeforeCommit()对用户选课操作进行有效性检验; |
//剔除无效操作:如输入无效的课程号,或已经选择了某一课程,已经选满的6学分等各种情况 |
boolean effect=processBeforeCommit(); |
//如果课程存在,且该学生具有选择该课程的资格,即effect为true,进入正式提交程序(tryCommit()) |
if (effect== true ) |
{tryCommit();} |
} |
} |
//对用户选课操作进行有效性检验; |
public boolean processBeforeCommit(){ |
//清空原结果显示区中的内容,如果有的话。 |
int k = 1 ; |
while (k < 10 ) { |
for ( int i = 1 ; i < 7 ; i++) { |
jtSearch.setValueAt( null , k - 1 , i - 1 ); |
} |
k++; |
} |
//取得用户输入的课程号 |
String userInput = jtfSelectedCourse.getText().toString().trim() |
.toLowerCase(); |
//无效操作1:在数据库中的coursexx表中查询该课程号。如果不存在该课程,给出提示。 |
String sql = "select cno from coursexx where cno=? " ; |
boolean flagCourseExist = false ; |
try { |
ps = con.prepareStatement(sql); |
ps.setString( 1 , userInput); |
rs = ps.executeQuery(); |
flagCourseExist = rs.next(); |
} catch (Exception eC) { |
eC.printStackTrace(); |
} |
if (!flagCourseExist) { |
JOptionPane.showMessageDialog( null , "该课程不存在,请重新输入" ); |
return false ; |
} |
//判断该学生选修课已选课程的总学分是否小于6; |
//无效操作2:如果已有选课记录,并且总学分大于6学分,该学生不能在选了。 |
PreparedStatement ps = null ; |
sql = "select sum(grade) " |
+ "from (select x.sname , x.cno,k.grade grade " |
+ "from coursexx k join choicesxx x " |
+ "on k.cno=x.cno and x.sname=?) result" ; |
String grade = null ; |
try { |
ps = con.prepareStatement(sql); |
ps.setString( 1 , usrName); |
rs = ps.executeQuery(); |
while (rs.next()) { |
grade = rs.getString( 1 ); |
if (grade== null ){grade= "0" ;} |
} |
} catch (Exception rrr) { |
rrr.printStackTrace(); |
} |
System.out.println( "总学分:" + grade); |
if (Integer.parseInt(grade) > 6 ) { |
JOptionPane.showMessageDialog( null , "你已经选满6学分,系统将退出" ); |
this .setVisible( false ); |
return false ; |
} |
//无效操作3:课程该学生已经选择了某课程,则不能再选该课程了。 |
sql = "select * from choicesxx where sname=? and cno=?" ; |
boolean flag = false ; |
try { |
ps = con.prepareStatement(sql); |
ps.setString( 1 , this .getUsrName()); |
ps.setString( 2 , userInput); |
rs = ps.executeQuery(); |
flag = rs.next(); |
} catch (Exception eaa) { |
eaa.printStackTrace(); |
} |
if (flag) { |
JOptionPane.showMessageDialog( null , "你已经选择了该课程。请另选课程" ); |
return false ;} |
//如果以上无效操作都不存在,则返回true,意为这是一个准有效操作 |
return true ; |
} |
//对有效的提交操作的进行处理 |
public void tryCommit() { |
// userInput为用户输入的课程ID. |
String userInput = jtfSelectedCourse.getText().toString().trim() |
.toLowerCase(); |
// if course still available(count<MAX_STUDENT),save result. |
// else if course not available,show Message to student. |
PreparedStatement ps; |
String sql = "select (Max-selectedCount) as RemainedCount " |
+ "from Coursexx where cno=?" ; |
try { |
ps = con.prepareStatement(sql); |
// 取得学生ID或名字,将课程ID存入学生选课表choicesxx |
ps.setString( 1 , userInput); |
rs = ps.executeQuery(); |
ResultSetMetaData meta = rs.getMetaData(); |
int cols = meta.getColumnCount(); |
int RemainedCount = - 1 ; |
while (rs.next()) { |
RemainedCount = rs.getInt( 1 ); |
System.out.println( "RemainedCount:" + RemainedCount); |
} |
//如果该课程还有选择的名额,提示单项选课操作成功。 |
if (RemainedCount > 0 ) { |
// save studentId and courseId to student-course table. |
// this.getUsrName();userInput |
sql = "insert into choicesxx values(?,?)" ; |
ps = con.prepareStatement(sql); |
ps.setString( 1 , this .getUsrName()); |
ps.setString( 2 , userInput); |
ps.executeUpdate(); |
JOptionPane.showMessageDialog( null , "选课成功: " + this .getUsrName() |
+ " 选了" + userInput + "." + "" + " 还有 " + RemainedCount |
+ " 人可以选该课程。" ); |
// 更新课程中已选该课程的人数:即将可选该课程的人数减去1个人。 |
sql = "update CourseXX set selectedCount=selectedCount+1 where cno=?" ; |
ps = con.prepareStatement(sql); |
ps.setString( 1 , userInput); |
ps.executeUpdate(); |
con.commit(); |
//如果该课程已经没有选择名额,提示重新选课 |
} |
} catch (Exception es) { |
es.printStackTrace(); |
try { |
con.rollback(); |
} catch (Exception ey) { |
ey.printStackTrace(); |
} |
} |
} |