2014-01-12 48 views
1

我有這個錯誤。索引2超出範圍。在pst.setString(2 textField.getText(); 我怎麼能對付它SQL服務器索引超出範圍錯誤

這是我的代碼

try{ 
    String sql="update inventory set Name=?,Category=?,Brand=?,Price=?,ExDate=?,Tags=?,Quantity=?,Barcode=? where Id=?"; 
    pst.setString(2, textField.getText()); 
    pst.setString(3, textField_1.getText()); 
    pst.setString(4, textField_2.getText()); 
    pst.setString(5, textField_3.getText()); 
    pst.setString(6, textField_4.getText()); 
    pst.setString(7, textField_5.getText()); 
    pst.setString(8, textField_9.getText()); 
    pst.setString(9, textField_6.getText()); 
    pst.setString(1, textField_8.getText()); 
    pst=con.prepareStatement(sql); 
    pst.executeUpdate(); 

    JOptionPane.showMessageDialog(null,"Updating Item Successful","Updated",JOptionPane.PLAIN_MESSAGE); 

    new server().setVisible(true); 
    setVisible(false); 
} catch(Exception e1){e1.printStackTrace();} 
+3

爲什麼它的價值,我會移動pst = con.prepareStatement(sql);在我的String聲明之後(String sql =「」),然後是setter方法。 – Ashish

+1

我不相信所有這些列都是真正的'varchar'列。爲什麼你們都使用'setString()'呢?你應該使用適當的'setXXX()'方法傳遞值(例如'setInt()'或'setDate()'),而不是讓驅動程序隱式轉換所有內容。 –

+0

@Ashish我只是解決了我的問題。 textField不在正確的位置。謝謝您的幫助。 – Rohan21

回答

1

基於documentation,夫婦的事情要注意這裏。

您的sql包含名稱 att索引1.因此,當您嘗試更新此列時,應該使用相同的索引。像這樣:

pst.setString(1, textField.getText()); 

你總是調用setString方法。雖然看起來像某些列可能是int或其他類型。例如你的「ID」欄應與此設置:

pst.setInt(9, Integer.parseInt(textField_8.getText())); (notice that I have changed the index as well.) 

正如我在我的評論前面提到的,你應該將你的pst=con.prepareStatement(sql)頂端。 (在你的字符串聲明之後)。

+0

我已經嘗試過,現在我有錯誤nvarchar值'3565547456644'的轉換溢出了一個int列。 – Rohan21

+0

所以我們的想法是使用與列的數據類型相對應的特定setter方法。你可以查看這個鏈接,看看最適合你的情況。 http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html – Ashish

1

已準備語句應該被用來設置變量之前被創建。正如評論者說,你需要之前設置變量移動準備好的語句創建

重構代碼是這樣的:

try{ 
    String sql="update inventory set Name=?,Category=?,Brand=?,Price=?,ExDate=?,Tags=?,Quantity=?,Barcode=? where Id=?"; 
    pst=con.prepareStatement(sql); 
    pst.setString(2, textField.getText()); 
    pst.setString(3, textField_1.getText()); 
    pst.setString(4, textField_2.getText()); 
    pst.setString(5, textField_3.getText()); 
    pst.setString(6, textField_4.getText()); 
    pst.setString(7, textField_5.getText()); 
    pst.setString(8, textField_9.getText()); 
    pst.setString(9, textField_6.getText()); 
    pst.setString(1, textField_8.getText()); 

    pst.executeUpdate(); 

    JOptionPane.showMessageDialog(null,"Updating Item Successful","Updated",JOptionPane.PLAIN_MESSAGE); 

    new server().setVisible(true); 
    setVisible(false); 
} 
catch(Exception e1) 
{ 
    e1.printStackTrace(); 
} 
finally 
{ 
    pst.close(); 
}