Вставьте int значение Resultset в базу данных SQL

0

Я работаю с MySQL-сервером, и я пытаюсь выбрать идентификатор из другой таблицы и вставить этот идентификатор в таблицу, но он не работает все время.

Код:

public void submit() throws Exception {

    Connection connection = getConnection();

    Statement stmt = connection.createStatement();
    Statement stmt1 = connection.createStatement();

    ResultSet asset_id = stmt.executeQuery("SELECT id FROM cars.asset_type WHERE asset_type.name =" + "'" + sellables.getValue()+ "'");

    while (asset_id.next()) {
        System.out.println(asset_id.getInt("id"));
    }

    double value = parseDouble(purchased.getText());
    System.out.println(value);

    LocalDate localDate = purchased_at.getValue();

    String insert = "INSERT INTO asset (type_id, purchase_price, purchased_at) VALUES ('"+ asset_id + "','" + value +"','" + localDate +"')";
    stmt1.executeUpdate(insert);
}

Я получаю то же сообщение об ошибке.

Caused by: java.sql.SQLException: Incorrect integer value: 'com.mysql.cj.jdbc.result.ResultSetImpl@1779d92' for column 'type_id' at row 1
  • 4
    Вы понимаете, что asset_id - это ResultSet а не int ? Вы читаете (и выбрасывание) РАСЧ в вашем в while цикла, а затем вы пытаетесь поставить ResultSet объект в вашу вставке заявление. Кроме того, прекратите использовать Statement прямо сейчас и перейдите к PreparedStatement и его методам setXXX (вы найдете множество примеров с небольшим поиском).
Теги:
jdbc

1 ответ

2
Лучший ответ

Нет никакой ценности при выполнении двух клиентских/серверных обращений в вашем случае, поэтому используйте только один оператор:

INSERT INTO asset (type_id, purchase_price, purchased_at)
SELECT id, ?, ?
FROM cars.asset_type 
WHERE asset_type.name = ?

Если вы действительно хотите вставить только последний идентификатор из запроса SELECT (как вы делали повторение результата SELECT и выбрасывали все остальные идентификаторы), вместо этого используйте этот запрос:

INSERT INTO asset (type_id, purchase_price, purchased_at)
SELECT id, ?, ?
FROM cars.asset_type 
WHERE asset_type.name = ?
ORDER BY id DESC -- I guess? Specify your preferred ordering here
LIMIT 1

Или с кодом JDBC вокруг него:

try (PreparedStatement s = connection.prepareStatement(
    "INSERT INTO asset (type_id, purchase_price, purchased_at) " +
    "SELECT id, ?, ? " +
    "FROM cars.asset_type " +
    "WHERE asset_type.name = ?")) {

    s.setDouble(1, parseDouble(purchased.getText()));
    s.setDate(2, Date.valueOf(purchased_at.getValue()));
    s.setString(3, sellables.getValue());
}

Это использование PreparedStatement, которое предотвратит SQL-инъекции и синтаксические ошибки, как тот, который вы получаете. На этом этапе я действительно рекомендую вам прочитать об этих темах!

  • 0
    Привет, я просто хотел упомянуть, что я слышал о SQL-инъекциях раньше. Дело в том, что я буду использовать свой SQL Server для своего проекта, и он НЕ будет опубликован. Я все еще очень ценю помощь!
  • 0
    @Vince: Это то, что вы говорите сейчас. И следующий разработчик, не подозревая о вашем предположении, будет опрометчиво отправлять ваш код в производство. Пожалуйста, никогда не объединяйте значения в строки SQL, независимо от того, для чего. Никогда

Ещё вопросы

Сообщество Overcoder
Наверх
Меню