MySQL + JAVA异常:在开始结果集之前

时间:2010-02-14 08:56:57

标签: java mysql jdbc

try
  {
   PreparedStatement  s = (PreparedStatement) conn.prepareStatement("SELECT voters.Check,count(*) FROM voting.voters where FirstName="+first+"and LastName="+last+" and SSN="+voter_ID);
   //java.sql.Statement k = conn.createStatement();

         rs=s.executeQuery();
               //s.executeQuery("SELECT voters.Check,count(*) FROM voting.voters where FirstName="+first+"and LastName="+last+" and SSN="+voter_ID);

         System.out.println(rs.first());
         c=rs.getInt(1);
         d=rs.getInt(2);

         System.out.println(c);
         System.out.println(d);

          if(c==1 && d==1)
          {
           s.executeUpdate("update cand set total=total+1 where ssn="+can_ID);
           System.out.println("Succeful vote");
           System.out.println("after vote");
           s.executeUpdate("update voters set voters.Check=1 where ssn="+voter_ID);
                 toclient=1;



             PreparedStatement  qw = (PreparedStatement) conn.prepareStatement("select FirstName from cand where ssn="+can_ID);

                 // rs=k.executeQuery("select FirstName from cand where ssn="+can_ID);
             rs1 = qw.executeQuery();//Error Here Plz help me
                  String name1= (String) rs1.getString(1);

                  System.out.println(name1);
                  s.executeUpdate("update voters set VTO="+name1+"where ssn="+voter_ID);
           System.out.println(rs.getString(1));

          }
          else
          {
           if(c != -1)
            toclient =2;
           if( d ==0)
            toclient =3;
           if( d>1)
            toclient =4;

          }
           System.out.println("out-----------");
           rs.close();

           s.close();

  }

   catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

错误IS:

java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)

6 个答案:

答案 0 :(得分:2)

虽然rs1.first()可能有用,但为了避免异常,我想避免使用{而不是rs1.next()

请参阅ResultSet.first()的javadoc:

  

SQLException - 如果发生数据库访问错误;在关闭的结果集上调用此方法或结果集类型为TYPE_FORWARD_ONLY

     

SQLFeatureNotSupportedException - 如果JDBC驱动程序不支持此方法

虽然next没有此限制

代码:

if (rs1.next()) {
    String name1 = rs1.getString(1);
}

提示:避免无用的类型转换(你的代码充满了它们)

答案 1 :(得分:2)

通常的做法是将rs.next()方法与while周期一起使用:

PreparedStatement st = conn.prepareStatement("select 1 from mytable");
ResultSet rs = st.executeQuery();
while (rs.next()) {
  // do something with result set
}
rs.close();
st.close();

为了清楚起见,我省略了try / catch / finally子句。请注意,您应该在单独的close()块中调用每个finally方法。

答案 2 :(得分:1)

在使用rs1.first()之前调用ResultSet

  

将光标移动到此ResultSet对象的第一行。

最初ResultSet的光标位置在集合开始之前。如果集合中有数据,first()方法将返回true。所以最好:

if (rs1.first()) {
    String name1 = (String) rs1.getString(1);
}

答案 3 :(得分:1)

获得结果集时,光标位于第一行之前。在将光标移动到第一行之前尝试获取任何内容将导致您收到的错误。您需要使用以下行将光标移动到第一行:

rs1.first();

之前打电话

String name1 = (String) rs1.getString(1);

当然,在调用rs1.getString(1)之前,请确保结果集包含条目。

答案 4 :(得分:1)

在您的代码段中,您可以创建PreparedStatements,但不能正确使用它们。准备好的语句应该用作一种“语句模板”,它在执行之前绑定到值。引用javadoc:

   PreparedStatement pstmt = con.prepareStatement(
                                 "UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)

这比您目前使用的PreparedStatement有两大优势:

  • 一个PreparedStatement可用于多次执行
  • 阻止可能的 SQL注入攻击

这里的第二个是biggie,如果例如你的变量firstlast是在用户界面中收集而没有重新格式化的,那么你就冒着为这些值输入SQL部分的风险,然后在你的陈述中结束!使用绑定参数,它们将仅用作值,而不是SQL语句的一部分。

答案 5 :(得分:0)

因此,为了确保正确使用PreparedStatment,这里是您调整最佳实践的原始示例(注意演员阵容是多余的):

PreparedStatement s = conn.prepareStatement(
    "SELECT voters.Check,count(*) " +
    "FROM voting.voters " +
    "where FirstName=? and LastName=? and SSN=?");
s.setString(1,first);
s.setString(2,last);
s.setString(3,voter_ID);
ResultSet rs = s.executeQuery();
while( rs.next() ) {
    c = rs.getInt(1);
    d = rs.getInt(2);
}

希望这有助于......:)

相关问题