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);
}