Почему я продолжаю получать исключительную операцию в ResultSet? - PullRequest
0 голосов
/ 08 апреля 2010

Почему я продолжаю получать исключительную операцию в ResultSet?

Вот код:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * SearchParts.java
 *
 * Created on 08-Mar-2010, 12:14:31
 */
package garits;

import java.sql.*;
import javax.swing.*;

/**
 *
 * @author Deniz
 */
public class SearchParts extends javax.swing.JFrame {

        /** Creates new form SearchParts */
        public SearchParts() {
                initComponents();
        }

        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")


        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
                if (!jTextField1.getText().equals("")) {
                        String result = "";
                        int Partnumber = Integer.parseInt(jTextField1.getText());
                        DB db = new DB();
                        try {
                                db.connect();
                                String query = "Select * from Stock Where Part_no =" + "'" + jTextField1.getText() + "'";
                                ResultSet rs = db.execSQL(query);
                                if (rs.equals(null)) {
                                        PartNotFound nf = new PartNotFound();
                                        nf.setVisible(true);

                                } else {
                                        ResultSetMetaData rsmd = rs.getMetaData();
                                        int numberOfColumns = rsmd.getColumnCount();
                                        int RowCount = 0;
                                        for (int i = 1; i < numberOfColumns; i++) {
                                                rs.getString(i);
                                                result += i + "/n";
                                        }

                                        if (!result.equals("")) {
                                                Receptionist_FranchiseePartFound part = new Receptionist_FranchiseePartFound();
                                                part.setVisible(true);
                                                while (rs.next()) {
                                                        RowCount++;



                                                }

                                                part.getTable().addRowSelectionInterval(0, RowCount);


                                        } else {
                                                PartNotFound nf = new PartNotFound();


                                        }
                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                                JOptionPane.showMessageDialog(jButton1, "More information needed for search", "Error Message", JOptionPane.ERROR_MESSAGE);
                        }


                } else if (!jTextField2.getText().equals("")) {
                        String result = "";

                        DB db = new DB();
                        try {
                                db.connect();
                                String query = "Select * from Stock Where Part_name =" + "'" + jTextField2.getText() + "'";
                                ResultSet rs = db.execSQL(query);
                                if (rs.equals(null)) {
                                        PartNotFound nf = new PartNotFound();
                                        nf.setVisible(true);

                                } else {
                                        ResultSetMetaData rsmd = rs.getMetaData();
                                        int numberOfColumns = rsmd.getColumnCount();
                                        int RowCount = 0;
                                        for (int i = 1; i < numberOfColumns; i++) {
                                                rs.getString(i);
                                                result += i + "/n";
                                        }


                                        // Receptionist_FranchiseePartFound part = new Receptionist_FranchiseePartFound();
                                        // part.setVisible(true);
                                        if (!result.equals("")) {
                                                Receptionist_FranchiseePartFound part = new Receptionist_FranchiseePartFound();
                                                part.setVisible(true);
                                                while (rs.next()) {
                                                        RowCount++;



                                                }
                                                part.getTable().addRowSelectionInterval(0, RowCount);


                                        } else {
                                                PartNotFound nf = new PartNotFound();
                                                nf.setVisible(true);

                                        }
                                }



                        } catch (Exception e) {
                                e.printStackTrace();
                                JOptionPane.showMessageDialog(jButton1, "More information needed for search", "Error Message", JOptionPane.ERROR_MESSAGE);
                        }
                } else if (jTextField1.getText().equals("") && jTextField2.getText().equals("")) {
                        String result = "";
                        DB db = new DB();
                        try {
                                db.connect();
                                String query = "Select * from Stock Where Manufacturer =" + "'" + jTextField3.getText() + "'AND Vehicle_type ='" + jTextField4.getText() + "'";
                                ResultSet rs = db.execSQL(query);
                                if (rs.equals(null)) {
                                        PartNotFound nf = new PartNotFound();
                                        nf.setVisible(true);

                                }
                                else{

                                ResultSetMetaData rsmd = rs.getMetaData();
                                int numberOfColumns = rsmd.getColumnCount();
                                int RowCount = 0;
                                for (int i = 1; i < numberOfColumns; i++) {
                                        rs.getString(i);
                                        result += i + "/n";
                                }


                                // Receptionist_FranchiseePartFound part = new Receptionist_FranchiseePartFound();
                                // part.setVisible(true);
                                if (!result.equals("")) {
                                        Receptionist_FranchiseePartFound part = new Receptionist_FranchiseePartFound();
                                        part.setVisible(true);
                                        while (rs.next()) {
                                                RowCount++;



                                        }
                                        part.getTable().addRowSelectionInterval(0, RowCount);


                                } else {
                                        PartNotFound nf = new PartNotFound();
                                        nf.setVisible(true);

                                }
                            }



                        } catch (Exception e) {
                                e.printStackTrace();
                                JOptionPane.showMessageDialog(jButton1, "More information needed for search", "Error Message", JOptionPane.ERROR_MESSAGE);
                        }


                } else if (jTextField3.getText().equals("") || jTextField4.getText().equals("")) {
                        JOptionPane.showMessageDialog(jButton1, "More information needed for search", "Error Message", JOptionPane.ERROR_MESSAGE);
                }

        }
        /**
         * @param args the command line arguments
         */
        // Variables declaration - do not modify
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton2;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel3;
        private javax.swing.JLabel jLabel4;
        private javax.swing.JLabel jLabel5;
        private javax.swing.JLabel jLabel6;
        private javax.swing.JLabel jLabel7;
        private javax.swing.JLabel jLabel8;
        private javax.swing.JTextField jTextField1;
        private javax.swing.JTextField jTextField2;
        private javax.swing.JTextField jTextField3;
        private javax.swing.JTextField jTextField4;
        // End of variables declaration
}

Ответы [ 6 ]

2 голосов
/ 08 апреля 2010

Я вижу несколько вещей

  • Первые rs никогда не равны нулю. Если строк нет, rs.next () вернет false

  • ResultSet начинает положение ДО первого ряда. Вам нужно вызвать rs.next (), чтобы перейти к первой строке, которая, как указано выше, вернет false, если строк нет.

Типичным шаблоном для использования ResultSet является ...

while (rs.next())
{
  rs.getXXX();
}
  • ResultSet должен ВСЕГДА быть закрыт () d, когда вы закончите, иначе вы можете утечь ресурсы базы данных. Это также относится к Connection, Statement, PreparedStatement, поэтому проверьте код БД в других классах.

  • При циклическом переключении метаданных столбца вам нужно сделать ..

    для (int i = 1; i <= numberOfColumns; i ++) { } </p>

Обратите внимание, что <=, а не <. Как вы правильно обнаружили, индексы столбцов JDBC начинаются с 1. </p>

  • Стоит рассмотреть возможность использования библиотеки, которая скрывает весь шум JDBC. Рассмотрим Spring, который имеет базовую абстракцию JDBC, сохраняя при этом всю мощь или вплоть до гибернации, которая является очень мощной, но имеет достаточно кривой обучения. В твоем случае я бы порекомендовал просто использовать пружинку.

См .: Spring docs

1 голос
/ 08 апреля 2010

Кроме того, взгляните на код javadoc / для метода execSQL (запроса) класса БД.Как правило, ResultSet никогда не является нулевым, например, когда вы используете PreparedStatement.executeQuery .Однако проверьте метод execSQL, чтобы проверить, будет ли он возвращать нулевой ResultSet.

1 голос
/ 08 апреля 2010

Вы всегда должны вызывать next () в ResultSet, прежде чем получить к нему доступ. Если нет, указатель указывает на строку перед первым. Вы делаете это с помощью while-циклов в вашем коде, но в некоторых местах это не так, что приводит к ошибке:

for (int i = 1; i < numberOfColumns; i++) {
  rs.getString(i);
  result += i + "/n";
}

Ох, и, как упоминает другой автор, вы не присваиваете результат переменной, поэтому вызов rs.getString (i) не имеет никакого эффекта. Но это, вероятно, ваш источник ошибки.

1 голос
/ 08 апреля 2010

если rs равно нулю, то rs.equals(null) выдаст NullPointerException вместо возврата false. Тем не менее, если это не исключение, которое вы получаете, то проблема заключается в другом.

0 голосов
/ 08 апреля 2010

Некоторые из них указали на некоторые ваши проблемы в коде.Причина вашего исключения заключается в том, что вы не перешли на первую строку, используя rs.next().Если вы ожидаете, что ваш оператор SQL будет извлекать только одну строку, вам, вероятно, следует изменить свой оператор rs.equals(null) на:

if (!rs.next()) {
    ...code here to set not found...
} else {
    ...code here to retrieve the columns...
}

Вот некоторые другие советы.В коде для извлечения столбцов использование rs.getString(i) ничего не делает, переменная result просто накапливает номера столбцов с помощью "/ n" (не новой строки; вероятно, это должно быть "\ n").Таким образом, цикл внутри этого раздела, вероятно, должен выглядеть следующим образом:

for (int i = 1; i <= numberOfColumns; i++) {
    result += rs.getString(i) + "\n";
}

Но конкатенация с неизменяемым String не годится и может привести к медленному выполнению для большого числа конкатенаций.Вместо этого используйте StringBuilder и инициализируйте его разумным размером, примерно так:

StringBuilder sb = new StringBuilder(256);
for (int i = 1; i <= numberOfColumns; i++) {
    sb.append(rs.getString(i)).append("\n");
}
result = sb.toString();

Позже вы перебираете набор результатов, поэтому в цикле по столбцам вы пытаетесь получить имена столбцов изметаданные?В этом случае:

StringBuilder sb = new StringBuilder(256);
for (int i = 1; i <= numberOfColumns; i++) {
    sb.append(rsmd.getColumnName(i)).append("\n");
}
result = sb.toString();

Но так как вам нужно проверить первую строку, следующий цикл не будет правильно подсчитывать количество строк, поэтому вам, возможно, придется это корректировать (и в этом нет необходимости).проверить result в этой точке, поскольку гарантированно больше не будет пустой строкой, поскольку в таблице должен быть хотя бы один столбец):

do {
    RowCount++; // recommend using rowCount.
} while (rs.next());

В конце концов, что вы используете result за?Кажется, что это просто используется, чтобы определить, были ли какие-то столбцы в результате.Если это все, то вы можете устранить большую часть этого кода.Для того, что у вас есть (я не знаю, является ли это вашим намерением), это может быть уменьшено до (в другом случае, если вы выполняете взаимодействие с БД):

DB db = new DB();
try {
    db.connect();
    String query = "select count(1) from Stock where Part_name =" + ...;
    ResultSet rs = db.execSQL(query);
    if (!rs.next()) {
        PartNotFound nf = ...;
        nf.setVisible(true);
    } else {
        Receptionist_FranchiseePartFound part = new Receptionist_FranchiseePartFound();
        part.setVisible(true);
        rowCount = rs.getInt(1);
        part.getTable().addRowSelectionInterval(0, rowCount);
    }
} catch (Exception e) {
    ...error handling with stack trace/JOptionPane...
}

Обратите внимание, что если выпосле подсчета строк лучше всего, чтобы ядро ​​базы данных сделало это за вас - цикл по результирующим строкам просто для подсчета их также означает, что все эти данные должны быть отправлены в ваше приложение.Вместо этого, если вы просто используете агрегатную функцию, тогда базе данных нужно всего лишь отправить одну строку и столбец вашему приложению.

0 голосов
/ 08 апреля 2010

Удалите следующую строку, это не имеет смысла. Он пытается получить значение столбца из ResultSet, но вы еще не прокрутили до первой строки

                                        rs.getString(i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...