обновить заявление в Java - PullRequest
2 голосов
/ 09 марта 2012

У меня есть следующий код для обновления записи. Код компилируется, однако он пропускает все в операторе try и отображает сообщение об ошибке в операторе catch. Я не уверен в том, что мне не хватает, так как он не отображает никакой синтаксической ошибки.

try {           
    PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ?");
    st.setString(1, textArea_Code.getText());
    st.setString(2, textArea_name.getText());
    st.setString(3, textArea_size.getText());
    st.setString(4, textArea_price.getText());
    st.executeUpdate();

    JOptionPane.showMessageDialog(frame, "Updated");    

} catch (SQLException e ) {
    JOptionPane.showMessageDialog(frame, "update not successful");      
}

Ответы [ 5 ]

11 голосов
/ 09 марта 2012

Вы проглатываете исключение, которое обычно является плохой идеей. По крайней мере, вызовите e.printStackTrace(), чтобы получить вывод исключения.

Как это происходит, у вас есть синтаксическая ошибка в вашем операторе SQL: UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ? - удалить запятую после Price = ?.


Чтобы устранить путаницу с тем, почему оператор UPDATE по-прежнему не работает, несмотря на исправление синтаксической ошибки, позвольте мне объяснить более подробно (гораздо проще сделать это в ответе, чем в комментариях).

Символ ? в строке SQL является заполнителем для значения, которое вы установите с помощью одного из различных методов set_() (в вашем случае, только когда-либо setString(). Каждый заполнитель нумеруется индексом начиная с 1 - первое ?, которое появляется в вашей строке, представляет индекс 1, второе представляет индекс 2 и т. д.

Ваша строка SQL выглядит следующим образом:

UPDATE item SET Name = ?, // 1
Size = ?, // 2
Price = ? // 3
WHERE ItemCode = ? // 4

Вы устанавливаете значения для своих заполнителей следующим образом:

st.setString(1, textArea_Code.getText()); // ItemCode is fourth in the SQL, should be 4
st.setString(2, textArea_name.getText()); // Name is first in the SQL, should be 1
st.setString(3, textArea_size.getText()); // Size is second in the SQL, should be 2
st.setString(4, textArea_price.getText()); // Price is third in the SQL, should be 3
2 голосов
/ 09 марта 2012

Вы пытались изменить выражение UPDATE на что-то вроде этого:

"UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?"

Я вынул последний , (запятую) после Price = ?, потому что он может конфликтовать с остальной частью SQL.

Edit:

Кроме того, вы можете изменить строку textArea_Code.getText(), чтобы она стала последним значением для подготовленного оператора. В противном случае значение ItemCode может не совпадать с порядком заполнителей ? (на данный момент похоже, что textArea_price.getText() используется в качестве значения для ItemCode ... , что может быть опасно для обновления! )

Вместо этого, что-то вроде этого:

PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?");
st.setString(1, textArea_name.getText());
st.setString(2, textArea_size.getText());
st.setString(3, textArea_price.getText());
st.setString(4, textArea_Code.getText());
st.executeUpdate();


Таким образом, все ? заполнители правильно совпадают с заданными значениями:

Имя : st.setString (1, textArea_ имя .getText ());
Размер : st.setString (2, textArea_ размер .getText ());
Цена : st.setString (3, textArea_ цена .getText ());
ItemCode : st.setString (4, textArea_ Code .getText ());


Это связано с тем, что параметры должны быть в том же порядке, что и заполнители (для получения дополнительной информации см. эту документацию .)

0 голосов
/ 11 августа 2015

После получения соединения с БД установите автоматическую фиксацию на true, чтобы БД обновлялась без ошибок.

connection = DBConnection.getInstance().getConnection();
connection.setAutoCommit(true);
0 голосов
/ 09 марта 2012
  1. Не могли бы вы попытаться добавить e.printStackTrace () в свой блок catch?
  2. В вашем запросе удалите, перед ГДЕ ОБНОВЛЕНИЕ элемента SET Имя =?, Размер =?, Цена =? ГДЕ ItemCode =?
  3. Может быть, проблема с вашей БД ... ваша таблица элементов в схеме по умолчанию? ... printStackTrace () поможет найти ответ
0 голосов
/ 09 марта 2012

Что выводится executeUpdate? Возвращает ли оно сколько-нибудь обновленных строк? Если нет, то, очевидно, ваше предложение об обновлении должно быть хорошо обновлено!

Если executeUpdate возвращает положительное число, указывающее, что оно обновило количество строк, возможно, ваша политика фиксации не настроена на автоматическую фиксацию. В этом случае вы можете захотеть сделать коммит после executeUpdate.

con.commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...