1

好的。这是一段代码,它应该在
使用 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 子句也仅用于调试目的。对不起。

顺便说一句,我要明确检索的数据在数据库中,并在我删除 where 子句时打印出来。

有谁知道这是什么原因以及如何解决它?

4

4 回答 4

2

试试这个,不要使用 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 子句的字符串函数。

于 2013-06-14T17:23:44.247 回答
2

如果您的结果只有 1 行,那么您将一无所获。

原因:

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

当您在 中执行 a.next()`while,光标已经前进了一次if。你应该只是在做

while(resultset.next()) {

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

于 2013-06-14T17:24:06.443 回答
1

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

于 2013-06-14T17:23:08.637 回答
1

我怀疑您的查询仅返回一行,但您正在跳过它。这一行:

if (resultset.next()) {

前进ResultSet到第一行。但是你的下一个陈述

while(resultset.next()) {

将其推进到可能不存在的下一行。

你应该只有while循环;删除if. 您可以在循环内设置一个boolean变量,以便您可以判断您是否有记录,如果没有任何行,则稍后打印。truewhile"No entries exist in this category"

于 2013-06-14T17:23:26.880 回答