1

http://codepaste.net/ujhdq2

    private Connection Econn;
    private DefaultTableModel examTable = new DefaultTableModel();
    public StudentInfoFrame(int eid) {
        initComponents();
        this.e_id = eid;
        try
        {
            jTable2.getParent().setBackground(Color.black);
            SimpleDataSource.init();
            Econn = SimpleDataSource.getConnection();
            jTable2.setModel(examTable);
            retrieveExams();
        }
        catch(SQLException | ClassNotFoundException e)
        {
            System.out.println(e);
        }
    }   

private void retrieveExams()
    {
        try
        {
            Statement stat = Econn.createStatement();
            String query = "SELECT date, name,forename,surname,status,Exam "+
            "FROM studentexam sx INNER JOIN Exam e ON sx.ex_id = e.ex_id " +
            "INNER JOIN employee em ON e.head = em.e_id WHERE st_id = "+this.e_id;
            ResultSet result = stat.executeQuery(query);
            if(result.first())
            {
            while(result.next())
            {
                String headname = result.getString("forename")+" "+result.getString("surname");
                String name = result.getString("name");
                int status = result.getInt("status");
                String pres;
                if(status == 1)
                {
                    pres = "Yes";
                }
                else
                {
                    pres = "No"; 
                }
                String exam;
                if(result.getInt("Exam") == 1)
                {
                    exam = "Yes";
                }
                else
                {
                    exam = "No";
                }
                Date date = result.getDate("date");
                int day = date.getDay();
                int year = date.getYear()+1900;
                int month = date.getMonth()+1;
                String datum = year+"-"+month+"-"+day; 
                int row = examTable.getRowCount()+1;
                examTable.insertRow(row, new Object[] { name,headname,datum, exam,pres });
            }
            }

        }

これは私にこのエラーを与えます:

スレッド「AWT-EventQueue-0」の例外java.lang.ArrayIndexOutOfBoundsException:1>0。

何か案が?

4

3 に答える 3

3

DefaultTableModel#insertRow指定されたインデックスにエントリを挿入します。モデルの現在の行数を超えてエントリを挿入することはできません

交換

examTable.insertRow(row, new Object[] { name,headname,datum, exam,pres });

examTable.addRow(new Object[] { name,headname,datum, exam,pres });

次の行を見てください。

if (result.first()) {
   while(result.next()) {

SQLクエリから単一のレコードが返されることを期待していることをお勧めします。ただし、を呼び出すResultSet#firstと、カーソルは最初の可能な行を超えて進められるため、whileループに入ることはありません。代わりに、これらの行を次のように置き換えることができます。

if (result.next()) {

これとは別に、aPreparedStatementではなく aを使用して、 SQL インジェクション攻撃Statementから保護します。

于 2013-01-31T17:58:57.620 に答える
3

交換

int row = examTable.getRowCount()+1;

int row = examTable.getRowCount();

Javaではすべてが0ベースのインデックスです

于 2013-01-31T17:59:10.217 に答える