Java F XML - NetBeans - Удалить из таблицы - MySQL - PullRequest
2 голосов
/ 10 января 2020

При попытке удалить строку из TableView появляется следующая ошибка:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '[value: 3]' at line 1

Что я хочу: После выбора строки из TableView я хочу удалить ее из базы данных .

@FXML
void delete(ActionEvent event) {
    try {

        int pos;
        pos = (int) tabelCustomers.getSelectionModel().getSelectedIndex();
        Customers c;
        c = tabelCustomers.getItems().get(pos);
        SimpleIntegerProperty idc = c.idc;
        String query;
        query = "DELETE FROM customers WHERE customers.idc = " + idc;

        try (Statement stm = cnx.createStatement()) {
            stm.executeUpdate(query);
        }
    } catch (SQLException ex) {

        Logger.getLogger(CustomersTableController.class.getName()).log(Level.SEVERE,
                null, ex);
    }
}

Чего мне не хватает? Я перепробовал много возможных решений, ничего не работает. Как правило, когда пользователь нажимает на строку в таблице, а затем нажимает кнопку «удалить», эту строку следует удалить из таблицы и БД.

Заранее спасибо.

1 Ответ

2 голосов
/ 10 января 2020
SimpleIntegerProperty idc = c.idc;
String query = "DELETE FROM customers WHERE customers.idc = " + idc;

Когда Object (это не String) используется в конкатенации строк, оно автоматически конвертируется в String путем вызова toString() для него. Строковое представление SimpleIntegerProperty - это не просто его значение, что означает, что ваш запрос в итоге выглядит примерно так:

DELETE FROM customers WHERE customers.idc = IntegerProperty [bean: <some_instance>, name: idc, value: 42]

Что явно недопустимо SQL. Вам необходимо извлечь значение свойства и использовать его как часть запроса. Однако не следует использовать конкатенацию строк при создании запросов SQL. Вместо этого вы должны использовать PreparedStatement с параметрами. Например:

String query = "DELETE FROM customers WHERE customers.idc = ?";
try (PreparedStatement ps = cnx.prepareStatement(query)) {
  ps.setInt(1, idc.get());
  ps.executeUpdate();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...