2014-01-12 3 views
1

У меня есть эта ошибка. Индекс 2 находится за пределами допустимого диапазона. на pst.setString (2, textField.getText(); , как я могу иметь дело с этимsql server index out of range error

это мой код

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

@ Ашиш, я просто решу свою проблему. textField не находится в правильных местах. Спасибо за помощь. – Rohan21

ответ

1

Основано на documentation, пару вещей, чтобы заметить здесь.

Ваш sql содержит имя индекс аттестации 1. Поэтому, когда вы пытаетесь обновить эту колонку, вы должны использовать тот же индекс. что-то вроде этого:

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

Вы всегда вызываете методы setString. Хотя похоже, что некоторые из столбцов могут быть типа int или еще. например, в столбце «Идентификатор» должен быть установлен с этим:

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

, поэтому идея заключается в использовании специальных методов настройки, которые соответствуют типу данных столбца. вы можете проверить эту ссылку, чтобы узнать, что может быть лучшим в вашем случае. 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(); 
}