2017-01-22 3 views
2

Установка

Я использую JDBC SQLite для базы данных моего сервера.Как проверить наличие ценности/почему ResultSet закрыт в SQLite?

То, что я пытаюсь сделать

Я хочу, чтобы проверить, если значение (например, ID или username) уже существует в таблице.

Мой код

PreparedStatement preparedStatement = connection.prepareStatement("select * from " + tableName + " where " + columnName + "=? limit 1"); 
preparedStatement.setString(1, value); 
ResultSet resultSet = preparedStatement.executeQuery(); 
resultSet.next(); 
try { // this was just for testing and is dumb because it prints an error every time the value does not exist. 
     // my code actually wasn't wrong. I just tested it badly .. 
     // it's replacable with if (resultSet.next()) 
    resultSet.getString(1); 
    System.out.println("check true"); 
    return true; 
} catch (Exception e) { 
    e.printStackTrace(); 
    System.out.println("check false"); 
    return false; 
} 

Здесь я хочу, чтобы проверить, является ли конкретный value уже существует в моем column(Name) в моем table.

Проблемы

Этот код всегда будет бросать SQLException: "ResultSet закрыто" в resultSet.getString(columnName). Не имеет значения, существует ли значение в таблице или нет. Мой запрос также может быть неправильным, потому что я не получаю то, что должен положить после select. У меня тогда был 1, но все использовали * для «все», и он ничего не изменил. Я серьезно не понимаю this, потому что это слишком сложно для меня, и я просто хотел бы знать, что делает аргумент после select ..

Подходы

Я пробовал много вещей, и прочитал много потоков, но Единственное, с чем я столкнулся, это то, что мне нужно сначала позвонить resultSet.next() и что ResultSet не выбрасывает исключение ResultSet closed, но ничего не изменило. Если есть лучший способ проверить, существует ли значение в таблице, скажите, пожалуйста.

Визуализация

a table У меня есть таблица здесь (в NULL «s не имеет значения, они могут быть какие-то случайные величины), и я хочу, чтобы проверить ggffvgvg существует или нет.

Полная StackTrace

java.sql.SQLException: ResultSet closed 
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69) 
at org.sqlite.core.CoreResultSet.markCol(CoreResultSet.java:96) 
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:436) 
at Database.check(Database.java:50) 
at ClientHandler.run(ClientHandler.java:72) 
+0

Вы ввели свое имя столбца в одинарные кавычки, превратив его в строковый литерал. –

+0

до этого у меня возникло исключение «column columnName», хотя оно и есть – creativecreatorormaybenot

+0

Я бы всегда завернул вызов ResultSet.next() в if. Он возвращает true, если на самом деле есть новая строка, которая была прочитана. Только после этого прочитайте значения из набора результатов –

ответ

2

resultSet.next() возвращает логическое значение, которое говорит вам, есть ли следующая запись или нет. Игнорирование этого возвращаемого значения похоже на стрельбу собственной ногой с помощью ракеты-носителя.

Таким образом, если значение, которое вы ищете не в наборе результатов (либо потому, что на самом деле это не так, или потому, что вы не просили его должным образом,) resultSet.next()будет возвращение false, и ваш код будет взорваться, за исключением того, что вы получаете.

Ваш пункт resultSet.getString(1) будет получать первый столбец в наборе результатов (если имеется текущая строка,) и вернет его вам предполагая, что это на самом деле строка. Первый столбец большинства таблиц обычно представляет собой целое число или какой-то другой тип данных ключа, что означает, что он редко является строкой.Если вам повезет, это будет то, что драйвер JDBC может преобразовать в строку, но вы соблазняете свою судьбу, предположив это.

Если вы хотите проверить только значение одного столбца, то ваш запрос должен выбрать только этот столбец. Это означает, что вместо

"select * from " + tableName + " where " + columnName + "=? limit 1"

вы должны сделать

"select " + columnName + " from " + tableName + " where " + columnName + "=? limit 1"

Однако, если я правильно понял, что вы пытаетесь достичь, вам даже не нужно получить поле и проверить его значение. Просто true или false результат resultSet.next() должен быть достаточным.

+1

Да, я сказал ему, что в комментариях тоже ... возникает другая проблема ('.next()' всегда возвращает false) –

+0

Теперь он работает. С моим кодом ничего не случилось, но я просто протестировал его неправильно. Я просто принял ваш ответ, потому что он единственный, и моя проблема решена. Фактически @MichaelRitter решил это для меня, потому что в комментарии он указал, что я, возможно, неправильно использовал свой SQLite-просмотрщик (не перезагружая мой сервер и не обновляя базу данных на сервере). Я просто положил код catch catch, потому что хотел увидеть, есть ли ошибка и получить некоторую обратную связь. Я знаю, что мог бы просто поставить (if (resultSet.net()), а также не имеет значения, поставил ли я '*' или мое 'columnName'. Спасибо, товарищи! – creativecreatorormaybenot

+0

@MichaelRitter Если вы хотите повернуть ваш комментарий в ответ, тогда OP, возможно, не согласится с моим и примет ваше. –

Смежные вопросы