JDBC - 查询在where语句之后不返回数据

时间:2013-06-14 17:16:24

标签: java jdbc

好。这是一段代码,在搜索数据库后应该返回一个数组 用JDBC。它是内置于JDK中的Apache Derby数据库。

import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class readnames {

static Object [] name;
static Object [] type;
static Object [] desc;
static ArrayList<String> l = new ArrayList<String>();
static ArrayList<String> l2 = new ArrayList<String>();
static ArrayList<String> l3 = new ArrayList<String>();

public static Object[] lies(String desq) {

    final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";

    final String CONNECTION = "jdbc:derby:AccountDatabase";

    try {
    Class.forName(DRIVER).newInstance();
    } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
    e.printStackTrace();
    }
    try {
        Connection connection = DriverManager.getConnection(CONNECTION);
        PreparedStatement statement = connection.prepareStatement("select * from WARPS WHERE CATEGORY=?");
        statement.setString(1, "Server");
        ResultSet resultset = statement.executeQuery();
            if (resultset.next()) {
                    while(resultset.next()) {
                        l.add(resultset.getString("NAME"));
                          l2.add(resultset.getString("CATEGORY"));  
                        l3.add(resultset.getString("DESCRIP"));
                    }
                    name = l.toArray();
                    type = l2.toArray();
                    desc = l3.toArray();
                    for (int i = 0; i < name.length; i++){
                        System.out.println(name[i]);
                    }
                    for (int i2= 0; i2 < type.length; i2++) {
                        System.out.println(type[i2]);
                    }
                    for (int i3= 0; i3 < desc.length; i3++) {
                        System.out.println(desc[i3]);
                    }
                    System.out.println("The method is called");
            } else {System.out.println("No entries exist in this category");
            }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return name;
} 

}

我的问题是,它根本不会返回任何内容。它工作正常,直到我尝试使用带有WHERE子句的PreparedStatement过滤数据。但我真的不想获得所有数据,而是具体数据。为了调试目的,添加了对println的调用;当where子句在代码中时,不会打印任何内容。

编辑:while循环中的l2.add和l3.add子句也仅用于调试目的。 SRY。

顺便说一句,我想要定义检索的数据是在数据库中,当我删除where子句时会打印出来。

有谁知道导致这种情况的原因以及如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

试试这个,不要使用if和while,尝试使用if和do while;

if (resultset.next()) {
do {
    l.add(resultset.getString("NAME"));
      l2.add(resultset.getString("CATEGORY"));  
    l3.add(resultset.getString("DESCRIP"));
}while(resultset.next());
name = l.toArray();
type = l2.toArray();
desc = l3.toArray();
for (int i = 0; i < name.length; i++){
    System.out.println(name[i]);
}
for (int i2= 0; i2 < type.length; i2++) {
    System.out.println(type[i2]);
}
for (int i3= 0; i3 < desc.length; i3++) {
    System.out.println(desc[i3]);
}
System.out.println("The method is called");
} else {System.out.println("No entries exist in this category");}

并在查询中写。

Connection connection = DriverManager.getConnection(CONNECTION);
PreparedStatement statement = connection.prepareStatement("select * from WARPS WHERE lower(CATEGORY)=?");
statement.setString(1, "Server".toLowerCase());

不要忘记使用where子句的字符串函数。

答案 1 :(得分:2)

如果您的结果只有1行,那么您将无法获得任何结果。

原因:

if (resultset.next()) {  
                    while(resultset.next()) {

当您在.next()中执行`while时,游标已在if前进一次。 你应该做的只是

while(resultset.next()) {

如果没有行,则不会执行。

答案 2 :(得分:1)

为什么用if语句包围你的时间?该条件将结果集向前移动一行,因此您缺少第一行。如果没有任何行,while语句将自行退出。如果围绕它不是必需的。

答案 3 :(得分:1)

我怀疑你的查询只返回一行但你正在跳过它。这一行:

if (resultset.next()) {

ResultSet推进到第一行。但接下来你的下一个声明

while(resultset.next()) {

将它推进到下一行,这可能不存在。

你应该只有while循环;删除if。您可以在boolean循环中将true变量设置为while,以便您可以判断是否有记录,如果没有任何行,则可以打印"No entries exist in this category"。< / p>