如何找到执行的SQL查询没有返回任何内容?

时间:2010-08-19 16:47:52

标签: java jdbc

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 个答案:

答案 0 :(得分:11)

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())是否会使光标在结果集中前进。在获得值之前不要再次前进。

答案 1 :(得分:5)

普通的JDBC习惯用法是在List<Entity>之类的集合中收集结果。另一个正常的习惯用法是在try-with-resources statement中打开资源,以便它们能够正常自动关闭。您的代码就是通过将这些资源保持打开来泄漏数据库资源。如果在短时间内重复运行,则DB将耗尽资源。

这是一个启动示例:

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 :(得分:2)

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 ");
}

也许〜

答案 3 :(得分:1)

if(!rs.isBeforeFirst())
   System.out.println("no data is returned");

答案 4 :(得分:0)

第一个(rs.next())将告诉您是否返回了任何数据。对那个反应,然后循环其余的(如果有的话)。

下面我提取一个逻辑,当有一行进入一个单独的方法时该做什么,然后在“if”之后和每个“where”之内调用它。

   . . .


   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);}
  }   

}

答案 5 :(得分:0)

在你的循环中放置一个计数器......

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个或更多,你会跳过第一个结果,如果你有一个结果,你会完全错过它。

祝你好运,

瑞克

答案 6 :(得分:0)

boolean got_result = false;
while (...) {
  got_result = true;
  ...
}
if (!got_result) {
  ...
}

答案 7 :(得分:0)

可以选择查询

rs.next();
int value = resultSet.getInt(1);
if (value == 0)
{
        //throw error message
}
else
        //