2015-04-29 25 views
-1

我想从我的SQL数据库中的表中拉出名字和姓氏。查询在没有“as First”部分的情况下可以很好地工作,并且我知道db连接没问题,因为它可以在代码的其他部分工作。将字符串从SQL拉到java

我收到的错误是table "First" does not exist,但它应该查看表名的firstName和lastName,而不是First和Last。

它与“我”for循环的内部,但这些值是正确的,playerid =我存在。

try { 
    String query2 = " SELECT firstName as First from player " 
      + "WHERE playerid = ?"; 
    PreparedStatement st2 = db.conn.prepareStatement(query); 
    st2.setInt(1, i); 
    ResultSet rs2 = st2.executeQuery(); 
    if (rs2.next()) { 
     setFirstName(rs2.getString("First")); 
    } 

    String query3 = " SELECT lastName as Last from player " 
      + "WHERE playerid = ?"; 
    PreparedStatement st3 = db.conn.prepareStatement(query); 
    st3.setInt(1, i); 
    ResultSet rs3 = st3.executeQuery(); 

    if (rs3.next()) { 
     setLastName(rs3.getString("Last")); 
    } 
} 
catch (SQLException e) { 
    e.printStackTrace(); 
} 
+2

请发布确切的错误消息,你越来越。 –

+4

您每次准备'query',而不是'query2'或'query3'。什么是“查询”? –

+0

你是对的。我正在准备错误的查询。它来自早期的代码。这解决了问题。不知道为什么我没有注意到。该错误消息说该表不存在,因为它准备的查询引用了不同的表,而不是我需要的。感谢您的帮助。 – DS1988

回答

0

更改你的代码是这样的:

PreparedStatement ps = null; 
try { 
    ps = db.conn.prepareStatement("SELECT firstName, lastName from player " 
     + "WHERE playerid = ?"); 

    for (int i = 0; i < MAX_PLAYERS /*<- or what is the loop condition?*/; i++) { 

     ps.setInt(1, i); 
     ResultSet rs = ps.executeQuery(); 

     if (rs.next()) { 
      // should these methods really be called within a loop? 
      setFirstName(rs.getString("firstName")); 
      setLastName(rs.getString("lastName")); 
     } 
     rs.close(); 
    } 
} catch (SQLException e) { 
    throw new RuntimeException(e); 
} finally { 
    if (ps != null) { 
     ps.close(); 
    } 
} 

一些注意事项:

当您使用的是PreparedStatement一个循环中,你应该建立一次声明,外循环,然后只在每次迭代期间重新分配绑定变量。

您应该尽量减少对数据库运行的查询数量;在你的情况下,你应该在单个查询中选择名字和姓氏。

关闭您打开的资源非常重要(在这种情况下为PreparedStatement)。我的例子显示了这是如何通常在Java 7之前完成的(在finally块中)。如果使用更新的Java版本,请使用try-with-resources statement

+0

事实证明我的错误是一个简单的错误,但是这个代码肯定比我做的更好。太多的SQL查询让代码难以跟踪。这很简单。谢谢。 – DS1988