Некоторые из них указали на некоторые ваши проблемы в коде.Причина вашего исключения заключается в том, что вы не перешли на первую строку, используя 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...
}
Обратите внимание, что если выпосле подсчета строк лучше всего, чтобы ядро базы данных сделало это за вас - цикл по результирующим строкам просто для подсчета их также означает, что все эти данные должны быть отправлены в ваше приложение.Вместо этого, если вы просто используете агрегатную функцию, тогда базе данных нужно всего лишь отправить одну строку и столбец вашему приложению.