无法解析SQLException:ColumnIndex超出范围

时间:2014-08-04 10:37:53

标签: java sql swing resultset

java.sql.SQLException: Column index out of range.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
    at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:407)
    at com.mysql.jdbc.ResultSetMetaData.getColumnName(ResultSetMetaData.java:258)
    at a.MyFrame.createTablePanel(MyFrame.java:58)
    at a.MyFrame.<init>(MyFrame.java:24)
    at a.MyFrame.main(MyFrame.java:19)

这是我在MyFrame课程中得到的堆栈跟踪。 这些是代码:

MyFrame.createTablePanel().

public JPanel createTablePanel () {
        DefaultTableModel tableModel = new DefaultTableModel();
        DB dB = new DB();
        dB.connectDB();
        ResultSet rs = dB.getData();
        try {       
            ResultSetMetaData rsMD = rs.getMetaData();
            String[] arr = new String[rsMD.getColumnCount()];
            for (int i = 0; i <= rsMD.getColumnCount(); i++) {
                arr[i] = rsMD.getColumnName(i+1);
            }
            tableModel.setColumnIdentifiers(arr);
            while (rs.next()) {
                for (int i = 0; i <= rsMD.getColumnCount(); i++) {
                    arr[i] = rs.getString(i+1);
                }
                tableModel.addRow(arr);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        JPanel tablePanel = new JPanel(new BorderLayout(5,5));
        JTable table = new JTable(tableModel);
        tablePanel.add(new JScrollPane(table), BorderLayout.CENTER);
        return tablePanel;
    }

它使用DB类与数据库进行通信:

DB Class.

public class DB {

    private final String driver = "com.mysql.jdbc.Driver";
    private final String url = "jdbc:mysql://localhost:3306/test";
    private final String user = "root";
    private final String pass = "khjthat";
    private final String table = "ungvien";
    Statement stmt;
    PreparedStatement pstmt;
    ResultSet rs;
    ResultSetMetaData rsMD;
    String str; //Query String.
    Connection connection;

    public DB() {
    }
    public void connectDB () {
        try {
            Class.forName(driver);
                System.out.println("Driver Loaded!");
            connection = DriverManager.getConnection(url,user,pass);
                System.out.println("Connected!");
        } catch (ClassNotFoundException e) {
            System.out.println("Class Not Found!");
        } catch (SQLException e) {
            System.out.println("Connection Error!");
        }
    }
    public void showData(ResultSet rs) {

            try {
                rsMD = rs.getMetaData();
                for (int i = 0; i < rsMD.getColumnCount(); i++) {
                    System.out.printf("\t%-10s ", rsMD.getColumnName(i+1));
                }
                System.out.println();
                while (rs.next()) {
                    System.out.printf("\t%-10s \t%-10s \t%-10s \t%-10s \n", rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
                }
            } catch (SQLException e) {
            }
    }
    public ResultSet getData() {
        str = "select * from " + table + ";";
        try {
            stmt = connection.createStatement();
            rs = stmt.executeQuery(str);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
    public ResultSet getDataTen(String ten) {
        str = "select ten,tuoi,truong,kn from " + table + " where ten = ? " ;
        try {
            pstmt = connection.prepareStatement(str);
            pstmt.setString(1, ten);
            rs = pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
    public void deleteTen (String ten) {
        str = "delete from " + table + " where ten = ? ";
        try {
            pstmt = connection.prepareStatement(str);
            pstmt.setString(1, ten);
            if (pstmt.executeUpdate() > 0) {
                System.out.println("Delete Successful!");
            } else {
                System.out.println("Delete Error!");
            }
        } catch (SQLException e) {
            System.out.println("Delete Error!");
            e.printStackTrace();
        }
    }
    public void insert (UngVien ungVien) {
        str = "insert into " + table + " values (?,?,?,?) ";
        try {
            pstmt = connection.prepareStatement(str);
            pstmt.setString(1, ungVien.getTen());
            pstmt.setInt(2, ungVien.getTuoi());
            pstmt.setString(3, ungVien.getTruong());
            pstmt.setInt(4, ungVien.getKn());
            if (pstmt.executeUpdate() > 0) {
                System.out.println("Insert Successful!");
            } else {
                System.out.println("Insert Error!");
            }
        } catch (SQLException e) {
            System.out.println("Insert Error!");
            e.printStackTrace();
        }
    }
    public void updateTen (String ten, UngVien ungVien) {
        str = "update " + table + " set tuoi =?, truong =?, kn =? where ten = ?";
        try {
            pstmt = connection.prepareStatement(str);
            pstmt.setInt(1, ungVien.getTuoi());
            pstmt.setString(2, ungVien.getTruong());
            pstmt.setInt(3, ungVien.getKn());
            pstmt.setString(4, ten);
            if (pstmt.executeUpdate() > 0) {
                System.out.println("Update Successful!");
            } else {
                System.out.println("Update Error!");
            }
        } catch (SQLException e) {
            System.out.println("Update Error!");
            e.printStackTrace();
        }
    }
    public static void main (String[] args) {
        DB dB = new DB();
        dB.connectDB();
        dB.showData(dB.getData());
    }
}

我测试了DB类,一切运行良好。

我今天下午试图调试这个,但我无法理解它是否就在那边:(

我对JAVA很新,我希望这个问题不会打扰你们。

请给我一些技巧:(

非常感谢。

2 个答案:

答案 0 :(得分:0)

如用户3145373在评论

中所述

来自

for (int i = 0; i <= rsMD.getColumnCount(); i++)

删除等号(=)并执行

for (int i = 0; i < rsMD.getColumnCount(); i++)

答案 1 :(得分:0)

进一步解释上述答案

假设有人要求你给我十个硬币,并将第一枚硬币的计数器设置为零,所以在这种情况下,你要去找他,直到计数达到九。

在这种情况下,您已初始化i = 0,因此您需要对其进行迭代,直到计数达到totalCount-1

或改为

for (int i = 1; i <= rsMD.getColumnCount(); i++)