2010-02-14 43 views
-2
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的MySQL + Java異常:在結果的開始時設置

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) 
+1

恕我直言,張貼代碼塊和一些例外,沒有任何解釋嘗試是不是很好:/ – dangerstat 2010-02-14 09:21:48

+1

我更喜歡這個「我有一個問題,請幫助」,沒有任何代碼;)。而這個很容易,所以不是那麼麻煩。 – Bozho 2010-02-14 09:24:14

+0

我明白你的意思了,雖然我看不出*有一點解釋的危害。我想有一個妥協。 – dangerstat 2010-02-14 13:11:30

回答

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語句的一部分。

1

呼叫rs1.first()

將光標移動到此ResultSet對象的第一行。

最初,ResultSet的光標位置在該組的開始之前。如果集合中有數據,則first()方法將返回true。因此較好的是:

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

雖然rs1.first()可以工作,避免例外,我想,以避免它,並使用rs1.next()代替。

看到ResultSet.first()的javadoc:

SQLException - 如果發生數據庫訪問錯誤;調用此方法在已關閉的結果集或結果集類型是TYPE_FORWARD_ONLY

SQLFeatureNotSupportedException - 如果JDBC驅動程序不支持此方法

next不具有這種限制

代碼:

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

個祕訣:避免無用的類型轉換(你的代碼是充斥其中)

+0

他不是'FORWARD_ONLY',我認爲是 – Bozho 2010-02-14 09:21:58

+0

是...但最佳實踐總是很好用 – nanda 2010-02-14 09:25:04

+0

這是一個最佳實踐,可以調用實際需要的方法; – Bozho 2010-02-14 09:28:59

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語句爲清楚起見。請注意,您應該在單獨的finally區塊中調用每個close()方法。

+0

他預計只有1行(查詢包含'id'),所以 - 'first()'更好。 – Bozho 2010-02-14 09:22:31

+0

沒有。看看'rs1 = qw.executeQuery(); //錯誤這裏Plz幫助我'行和上面'qw'的聲明 - 我認爲作者_應該期望結果集中有多個記錄(但我可能是錯的,當然 - 沒有一些解釋就不那麼明顯)。 – incarnate 2010-02-14 09:39:58

+0

他正在通過唯一的(表觀)ID進行查詢。 – Bozho 2010-02-14 09:47:07

1

當你得到一個結果集時,光標放在第一行之前。在將光標移動到第一行之前嘗試獲取任何內容將導致您收到的錯誤。您需要將光標移動到使用此行的第一行:

rs1.first(); 

調用

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

當然之前,要確保結果集包含了調用rs1.getString前項(1)。

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

希望這有助於... :)