import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
public class storedprocedure extends JFrame implements ItemListener {
Connection conn;
CallableStatement cstm1;
CallableStatement cstm2;
ResultSet rs1;
ResultSet rs2;
JTable table;
DefaultTableModel dtm;
DefaultComboBoxModel dcm;
JComboBox comb;
JLabel label1 = new JLabel("请选择课程名称:");;
JLabel label2 = new JLabel("考试人数:");
JLabel label3 = new JLabel("平均分:");
Vector<String> title = new Vector<String>();
public storedprocedure (){
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(Exception e1){JOptionPane.showMessageDialog(null,"驱动获取失败!");}
try{
Connection conn =DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=练习","sa","");
}catch(SQLException e2){JOptionPane.showMessageDialog(null,"数据库连接失败!");}
try{
cstm1 = conn.prepareCall("{call getcoursename()}");
rs1 = cstm1.executeQuery();
dcm = new DefaultComboBoxModel();
comb = new JComboBox(dcm);
initcombobox();
cstm2 = conn.prepareCall("{?=call stat(?,?)}", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
cstm2.registerOutParameter(1, java.sql.Types.INTEGER);
cstm2.setString(2, (String)comb.getSelectedItem()+"%");
cstm2.registerOutParameter(3, java.sql.Types.FLOAT);
rs2 = cstm2.executeQuery();
ResultSetMetaData dbmd = rs2.getMetaData();
for(int i=1 ;i<=dbmd.getColumnCount();i++){
title.addElement(dbmd.getColumnName(i));
}
dtm = new DefaultTableModel(null,title);
table = new JTable(dtm);
inittable();
int count = cstm2.getInt(1);
Float avg = Math.round(cstm2.getFloat(3)*100f)/100.0f;
table.setRowHeight(20);
label2.setText("考试人数:"+count);
label3.setText("平均分:"+avg);
JPanel pane = new JPanel();
pane.add(label1);pane.add(comb);pane.add(label2);pane.add(label3);
JScrollPane jp = new JScrollPane(table);
Container con = getContentPane();
con.setLayout(new BorderLayout());
con.add(pane,"North");
con.add(pane,"Center");
comb.addItemListener(this);
}catch(Exception e4){e4.printStackTrace();}
this.addWindowListener(new WindowAdapter(){
public void WindowClosing(WindowEvent e){
try{
rs1.close();
rs2.close();
cstm1.close();
cstm2.close();
conn.close();
}catch(SQLException e6){e6.printStackTrace();};
}
});
setTitle("学生成绩浏览");
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((screen.width-400)/2,(screen.height-400)/2);
setSize(600,400);
setVisible(true);
}
public void inittable(){
dtm.setRowCount(0);
try{
Vector<String> v = new Vector<String>();
rs2.beforeFirst();
while(rs2.next()){
for(int i=1;i<=title.size();i++){
v.addElement(rs2.getString(i));
}
dtm.addRow(v);
}
}catch(Exception e5){e5.printStackTrace();};
}
public void initcombobox(){
dcm.removeAllElements();
try{
while(rs1.next()){
dcm.addElement(rs1.getString(1).trim());
}
}catch(Exception e3){e3.printStackTrace();}
}
public void itemStateChanged(ItemEvent e){
if(e.getStateChange()==ItemEvent.SELECTED){
try{
cstm2.registerOutParameter(1, java.sql.Types.INTEGER);
cstm2.setString(2, (String)comb.getSelectedItem()+"%");
cstm2.registerOutParameter(3, java.sql.Types.FLOAT);
rs2 = cstm2.executeQuery();
inittable();
int count = cstm2.getInt(1);
Float avg = Math.round(cstm2.getFloat(3)*100f)/100.0f;
table.setRowHeight(20);
label2.setText("考试人数:"+count);
label3.setText("平均分:"+avg);
}catch(Exception e7){e7.printStackTrace();}
}
}
public static void main (String[] args){
new storedprocedure();
}}运行错误提示:java.lang.NullPointerException
at storedprocedure.<init>(storedprocedure.java:37)
at storedprocedure.main(storedprocedure.java:135)
也就是这一个地方有问题:cstm1 = conn.prepareCall("{call getcoursename()}");求解!!!!!!!!
注意结构,
把Connection 往外面提出去,作用域就在那try catch里面,然后就消失了。
Connection conn = null;
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(Exception e1){JOptionPane.showMessageDialog(null,"驱动获取失败!");}
try{
conn =DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=练习","sa","");
}catch(SQLException e2){
JOptionPane.showMessageDialog(null,"数据库连接失败!");
}
try{
cstm1 = conn.prepareCall("{call getcoursename()}");