Я извлекаю данные из базы данных и получаю com.microsoft.sqlserver.jdbc.SQLServerException: The index 15 is out of range.
во время RunTime
.
Мой класс подключения выполняется следующим образом:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
public class SQLConnection {
private String type = "jdbc:sqlserver:";
private String url = "//thinkThisIsAnActualAddress;";
private String database = "database=SomeDatabase;";
private String user = "user=NotAUser;";
private String password = "password=NotAPass;";
private String connectionURL;
private final String query = "SELECT FIELD1, FIELD2, FIELD3, FIELD4, FIELD4, FIELD5"
+ " FIELD6, FIELD7, FIELD8, FIELD9, FIELD10, FIELD11,"
+ " FIELD12, FIELD13, FIELD14"
+ " FROM TABLE_OWNER.TABLE_FIELDS_DTL"
+ " LEFT JOIN TABLE_OWNER2.TABLE_FIELDS_DTL2"
+ " ON TABLE_OWNER.TABLE_FIELDS_DTL.SOME_FOREIGN_KEY_SK = TABLE_OWNER2.TABLE_FIELDS_DTL.SOME_FOREIGN_KEY_SK"
+ " WHERE THIS_FIELD = 'X'";
ResultSet resultSet = null;
public String getURL(){
makeString();
return connectionURL;
}
public void makeString(){
connectionURL = type + url + database + user + password;
}
public void connect(){
// Load SQL Server JDBC driver and establish connection.
System.out.print("Dialing the Matrix... ");
try (Connection connection = DriverManager.getConnection(getURL());
Statement statement = connection.createStatement();) {
// Connection message
System.out.println("You are in, Neo...");
resultSet = statement.executeQuery(query);
int i = 1;
while(resultSet.next()){
System.out.println(resultSet.getString(i) + " ");
i++;
}
} catch (SQLException e) {
System.out.println();
e.printStackTrace();
}
}
}
Хотя я понимаю, почему это происходит, в этом цикле while
:
int i = 1;
while(resultSet.next()){
System.out.println(resultSet.getString(i) + " ");
i++;
}
Я не совсем понимаю, как получить данные без него, так как есть 14 полей и произвольное количество строк в базе данных, соответствующих этому запросу, в зависимости от дня. Простым «исправлением» будет замена строки while(resultSet.next())
на while(resultSet.next() && i < 14)
, что устранит исключение, но не даст искомого результата — возможности перебирать все строки, соответствующие запросу.
Что мне здесь не хватает?
Я думал, что это связано с SQL, я полагаю, я не понимаю, как структура данных ведет себя в этом цикле while. Я проверял документацию по нему, и кажется, что это будет правильный ответ для него: docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html. Я проверю это прямо сейчас.
Большой! Надеюсь, вы найдете ответ, который ищете.
Посмотрите на вывод, который вы печатаете. Вы получаете только первое поле из первой записи, только второе поле из второй записи и так далее.
Я просто проверял записи в базе данных, @tgdavies, и ты прав. Моя петля совершенно сумасшедшая. Я полагаю, мне нужно научиться делать это правильно (много часов работаю над проектом вакцины от COVID, и мой мозг тает). Спасибо!
Не беспокойтесь, Люк, пожалуйста, пришлите вакцину ;-)
Это идет @tgdavies, первая рассылка моей компании происходит завтра, если я не ошибаюсь. :D
Я не знаю, что вы хотите достичь здесь, но исключение очевидно. У вас всего 14 столбцов, и вы увеличиваете i
на 1 каждый раз в цикле, когда i>14
вы извлекаете 15-й столбец в строке, что, безусловно, является исключением.
Если вы хотите прочитать каждую строку, вы используете цикл while (rs.next())
, который будет срабатывать для каждой строки.
Если для отдельной строки вы хотите прочитать каждый столбец, вы должны использовать метод .getString(col)
или .getInt(col)
или .getObject(col, LocalDateTime.class)
или getWhateverYouWant, передавая в качестве аргумента col
либо индекс на основе 1, либо имя столбца, который вы хотите принести.
Если вы хотите и то, и другое, ну, вам нужно будет получить метаданные, чтобы узнать, сколько столбцов, или вы просто проверяете свой собственный запрос и жестко задаете число. Таким образом, для вашего конкретного кода, если вы хотите напечатать каждый столбец из каждой строки:
while (rs.next()) {
for (int i = 1; i <= 14; i++) System.out.println(rs.getString(i));
}
Если запрос возвращает 4 строки, будет напечатано 4*14 = 56 строк текста.
Ха-ха, это именно то, что я закодировал вчера, когда понял, что происходит. В любом случае спасибо за ответ здесь, вы предлагаете гораздо больше глубины, и я действительно ценю это, поэтому я принимаю это как ответ. Огромное спасибо!
Я не понял, что именно вы спрашиваете, это связано с SQL или связано с циклом. если это связано с результатом SQL, он будет правильным, и вы сохраните его в наборе результатов и сможете повторить его. Так что вы можете запросить цикл, если это так, рассмотрите возможность проверки ссылки stackoverflow.com/questions/85190/…