Как обнаружить, что выполненный SQL-запрос ничего не дал? - PullRequest
3 голосов
/ 19 августа 2010
import java.net.URL;
import java.net.URLConnection;
import java.sql.*;
public class searchlink{
public static void main(String args[]) throws Exception {
    //String link="http://hosted.ap.org";
    Connection con=null;
    Statement stmt=null;
    Statement stmtR=null;
    if(con==null){
            SQLConnection.setURL("jdbc:sqlserver://192.168.2.53\\SQL2005;user=sa;password=365media;DatabaseName=LN_ADWEEK");
            con=SQLConnection.getNewConnection();
            stmt=con.createStatement();
            stmtR=con.createStatement();
    }
    ResultSet rs;
    rs=stmt.executeQuery("select url from urls where url='http://www.topix.com/rty/elyria-oh'");
    while(rs.next()){
    String mem=rs.getString(1);
    System.out.println("Result is "+mem);}
}
}

Приведенная выше программа печатает выходные данные, если запрос возвращает строку. Если запрос не возвращает ничего, программа останавливается, ничего не печатая.

Вместо того, чтобы его останавливать, ничего не печатая, я хочу, чтобы программа идентифицировала, что запрос ничего не возвратил, и распечатала вывод, говорящий что-то вроде этого: «После выполнения SQL-запроса ничего не возвращается».

Как определить с помощью какого-либо метода или переменной, что запрос был выполнен, не возвращая ни одной строки?

Ответы [ 8 ]

11 голосов
/ 19 августа 2010
boolean hasRows = false;
while(rs.next()){
  hasRows = true;
  // do other stuff required.
}

if(!hasRows)
{
  // do stuff when no rows present.
}

- или -

if(!rs.next())
{
  // do stuff when no rows prsent.
}
else
{
  do{
  // do stuff required
  }while(rs.next());
}

с учетом того, что проверка if (! Rs.next ()) будет перемещать курсор в наборе результатов Не продвигайте его снова, пока не получите значения.

5 голосов
/ 19 августа 2010

Обычная идиома JDBC - собирать результаты в коллекцию, подобную List<Entity>.Другой нормальный способ - открыть ресурсы в операторе try-with-resources , чтобы они автоматически закрывались автоматически.Ваш код именно пропускает ресурсы БД, оставляя эти ресурсы открытыми.Если вы выполните это несколько раз в течение короткого времени, то в БД не хватит ресурсов.

Вот пример запуска:

public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM entity");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Entity entity = new Entity(); 
            entity.setId(resultSet.getLong("id"));
            entity.setName(resultSet.getString("name"));
            entity.setValue(resultSet.getInteger("value"));
            entities.add(entity);
        }
    }

    return entities;
}

Таким образом, вы можете использовать обычные List методы для определения состояния результата:

List<Entity> entities = entityDAO.list();

if (entities.isEmpty()) {
    // It is empty!
}
else if (entities.size() == 1) {
    // It has only one row!
}
else {
    // It has more than one row!
}

См. Также:

2 голосов
/ 19 августа 2010
if (rs.hasNext())
{
    while(rs.next())
   {
    String mem=rs.getString(1);
    System.out.println("Result is "+mem);
   }

}
else
{
   System.out.println("There is nothing returned after SQL query execution ");
}

может быть ~

1 голос
/ 31 декабря 2013
if(!rs.isBeforeFirst())
   System.out.println("no data is returned");
0 голосов
/ 07 апреля 2017

для выбора запросов вы можете сделать

rs.next();
int value = resultSet.getInt(1);
if (value == 0)
{
        //throw error message
}
else
        // 
0 голосов
/ 19 августа 2010
boolean got_result = false;
while (...) {
  got_result = true;
  ...
}
if (!got_result) {
  ...
}
0 голосов
/ 19 августа 2010

Поместите счетчик в свой цикл ...

int count = 0;

while ( rs.next() )
{
    count++;

    String mem=rs.getString(1);   
    System.out.println("Result is "+mem);}
    .
    .
    .
}

затем ...

if (count==0)
{
    // show your message "There is nothing returned after SQL query execution"
}

Любой вызов rs.next() перемещает курсор так, что if (rs.next() == false) будет ударять васодин вперед и заставит вас пропустить первый результат, если у вас было 2 или более, или пропустить его полностью, если у вас был один результат.

Удачи,

Рик

0 голосов
/ 19 августа 2010

Первый (rs.next ()) сообщит вам, были ли возвращены какие-либо данные. Реагируйте на это, затем переберите остальные (если они есть).

Ниже я извлекаю логику для того, что делать, когда есть строка в отдельный метод, и затем вызываю это после «если» и внутри каждого «где».

   . . .


   ResultSet rs;
   rs=stmt.executeQuery("select url from urls where url='http://www.topix.com/rty/elyria-oh'");
   if (rs.next() {
      printRow(rs);
      while(rs.next()){
          printRow(rs);
      }
    }
    else {
        System.out.println("no data returned");
    }
  }

  static public printRow(ResultSet rs) {
    String mem=rs.getString(1);
    System.out.println("Result is "+mem);}
  }   

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