我在网上看了一下,但似乎无法找到我的问题的明确答案。
基本上,我有一个成功运行的数据库和表。现在我想逐一从表中读取每一行并将结果存储到一个数组中,我试图使用for循环更专业而不是使用重复。
我有这段代码
for (int i=1; i<=8; i++)
{
String query = "Select * FROM Table1 WHERE ID = i";
Rs = St.executeQuery(query);
COL1Title[i] = Rs.getString("CO1Name");
COL2Age[i] = Rs.getString("CO2Rating");
}
for循环在try catch语句中,它抱怨错误“'where子句'中的未知列'i'”
我猜测在查询中如何插入变量i有某种方法。
我应该指出ID是一个添加了自动增量功能的列,如果有帮助则是主键
有人可以帮助我吗?
答案 0 :(得分:4)
首先,我们可以简化执行单个查询的任务。注意添加范围限制和ORDER BY - 没有ORDER BY结果有一个未指定的顺序!
PreparedStatement stmt = "Select ID, CO1Name, CO2Rating"
+ " FROM Table1"
+ " WHERE ID >= ? AND ID <= ?"
+ " ORDER BY ID";
并在占位符中绑定(除非有充分的理由否则,总是在将数据注入查询时使用占位符)。在这种情况下,这些值可能已在上面进行了硬编码,就像它们在for循环中被硬编码一样,但此处显示了绑定以供将来参考:
stmt.setInt(1, 1);
stmt.setInt(2, 8);
然后执行查询:
ResultSet rs = stmt.executeQuery();
迭代结果。请注意,rs.next()
必须在读取任何列之前调用一次(光标在任何记录之前启动),在这种情况下,它可以轻松处理大量结果。
while (rs.next()) {
int id = rs.getInt("ID");
String title = rs.getString("CO1Name");
String name = rs.getString("CO2Rating");
// do stuff with this record
}
请注意,即使ORDER BY保证结果按ID的顺序迭代,假设数据库基数规则确保每个结果都有唯一的ID,则可能会返回0到8条记录 - 即不存在的记录可能需要单独检测/处理。
另外(但未显示),确保在完成后清理(close
)ResultSet:使用try / finally或try-with-resources构造。
答案 1 :(得分:1)
你需要在字符串中传递i作为整数,将行替换为:
String query = String.format("Select * FROM Table1 WHERE ID = %d",i);