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

MySQL+;JAVA异常:在结果集开始之前,java,mysql,jdbc,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();

错误是:

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();
  }
在使用
ResultSet
之前,先调用
rs1.first()

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

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

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)
虽然
rs1.first()
可能有效,但为了避免异常,我想避免它,而是使用
rs1.next()

请参阅
ResultSet.first()的javadoc

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

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

next
没有此限制

代码:


提示:避免无用的类型转换(您的代码中充满了类型转换)

通常的做法是使用
rs.next()
方法和
同时循环:

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

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

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

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

rs1.first();

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

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

String name1 = (String) rs1.getString(1);
与当前使用的PreparedStatement相比,这有两大优势:

  • 一条PreparedStatement可用于多次执行
  • 可以防止可能的SQL注入攻击

第二个是大问题,例如,如果您的变量
first
last
收集在用户界面中,并且没有重新格式化,那么您就有可能为这些值输入部分SQL,然后这些值会出现在您的语句中!使用绑定参数时,它们将仅用作值,而不是SQL语句的一部分。

因此,为了确保正确使用PreparedStation,以下是调整为最佳实践的原始示例(注意强制转换是多余的):


希望这有帮助……:)

我觉得在没有任何解释的情况下发布代码块和一些异常是不好的:/我更喜欢这样,而不是“我有一个问题,请帮助”和没有任何代码;)。这个很简单,所以没那么麻烦。我明白你的意思,不过我看不出一点解释有什么害处。我想这是一个折衷方案。不利用preparedstatement能力(查询中的硬编码值),不利用SQL能力(所有不必要的
SELECT
查询),糟糕的SQL(即
count(*)
毫无意义),资源泄漏(没有关闭
最终
),糟糕的代码风格(不完全清楚您想要实现什么)、糟糕的数据模型(不清楚的列名,显然没有FK关系(使用FirstName而不是ID)).我很想帮你摆脱这一切,但我不知道从哪里开始。我想,他的方法不仅仅是向前的
,我想是的……但最佳实践总是好用的,它是调用你实际需要的方法的最佳实践;)并失去JDBC的优势(DBMS的互兼容性)?在这种情况下,你不会失去任何东西。如果没有用法,该方法将不存在。他只需要1行(查询包含
id
),因此-
first()
更好。不。看看
rs1=qw.executeQuery()//这里的错误请帮助我
行和上面的
qw
声明-我认为作者应该期望结果集中有不止一条记录(当然,我可能错了-没有一些解释就不那么明显)。他是通过(明显的)ID进行查询的,这是唯一的。就个人而言,我总是在(rs.next())
用于多个结果,或
if(rs.next())
用于单个结果。
String name1 = (String) rs1.getString(1);
   PreparedStatement pstmt = con.prepareStatement(
                                 "UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)
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);
}