好。这是一段代码,在搜索数据库后应该返回一个数组 用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子句时会打印出来。有谁知道导致这种情况的原因以及如何解决这个问题?
答案 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>