2013-11-24 35 views
1

我已经在网上看了一下,但似乎无法找到我的问题的确切答案。尝试将Java变量传递到一个SQL字符串

基本上,我有一个数据库和成功工作的表。现在我想从表中逐行读取每一行并将结果存储到一个数组中,我试图使用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如何插入到查询中的某种方式。

我要指出的ID被添加在具有自动递增功能,一列是主键是否有帮助

谁能帮我在这里?

+1

你可以简单地连接'''''''。正如在'''String query =“Select * FROM Table1 WHERE ID =”+ i'''。 –

+0

@ user2864740'i'是一个'int'。不用担心sql注入。 –

+0

也许你应该一次阅读*许多*行? 'WHERE ID> = 1 AND ID <= 8'并循环结果集?使用*占位符*填写查询数据。 – user2864740

回答

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返回记录 - 也就是说,不需要的记录可能需要单独检测/处理。

另外(但没有显示),请务必在完成时清理ResultSet(close):使用try/finally或try-with-resources构造。

+0

对不起,愚蠢的问题,但整数意味着什么getString – lecardo

+0

@Bobski他们引用列索引(1是第一列)。或者,也许更好,可以使用列名称。请参阅http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getInt(int) - 实际上,我会将其更改回来:)\ – user2864740

1

您需要将我的字符串作为整数,通过替换线:

String query = String.format("Select * FROM Table1 WHERE ID = %d",i); 
+1

我怎么得到downvoted :) – user3020494

+0

我为倡导使用手动SQL字符串建设downvoted。不要*没有很好的理由*。绝对*不建议*不解释为什么它应该只用于非常好的理由! – user2864740

+0

这个手动SQL构建绝对没有错。如果您正在考虑SQL注入,我希望看到您尝试使用循环定义的整数。 –

相关问题