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)
答案 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有两大优势:
这里的第二个是biggie,如果例如你的变量first
和last
是在用户界面中收集而没有重新格式化的,那么你就冒着为这些值输入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);
}
希望这有助于......:)