Вставка SQL с '

Я пытаюсь вставить String с sql в свою базу данных. Эта строка может содержать «'».

Когда я сейчас пытаюсь вставить его в свою базу данных, я получаю эту ошибку:

[SQLITE_ERROR] SQL error or missing database (near " characters after the ' ": syntax error)

Вызов функции:

  Main.execute("INSERT INTO Projektname(projektname) VALUES('" + txtFd_name.getText() + "');");

Main.execute:

public static void execute(String query){
        class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:D:\\user\\eclipse-workspace\\S2LDB.db");
        Statement stat = conn.createStatement();
        stat.execute(query);
}

я пробовал с org.apache.commons.text.StringEscapeUtils.escapeJava()

С PreparedStatement вы можете использовать setString, и вы будете защищены от SQL-инъекций. Вы не должны пытаться вклеивать ввод непосредственно в свой запрос.

khelwood 13.07.2018 13:49

@khelwood escapeJava() тогда не нужен?

Builder_20 13.07.2018 13:56

Да, escapeJava не нужен, если вы правильно используете параметры оператора.

khelwood 13.07.2018 13:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
134
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

String sql = "INSERT INTO Projektname(projektname) VALUES(?)";

try (Connection conn = this.connect();
    PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setString(1, txtFd_name.getText());
        pstmt.executeUpdate();
} catch (SQLException e) {
    System.out.println(e.getMessage());
}

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

String name = txtFd_name.getText().replaceAll("'", "''");
String sql = "INSERT INTO Projektname(projektname) VALUES('" + name + "');");
Main.execute(sql);

Но я не рекомендую это делать, потому что это может иметь неприятные последствия в зависимости от того, сколько одинарных кавычек у вас уже есть. Лучше всего использовать подготовленный оператор.

Вам не хватает pstmt.executeUpdate();

Codo 13.07.2018 13:52

@Codo Это чудо, что мы не делаем больше ошибок, чем уже делаем :-)

Tim Biegeleisen 13.07.2018 13:53

ты, я буду использовать preparedStatement сейчас

Builder_20 13.07.2018 14:02

вы должны экранировать 'двойной одинарной кавычкой, прежде чем использовать это значение в своей строковой композиции

txtFd_name.getText()

присвоить значение строковой переменной, а затем заменить «на» (дважды), и это должно работать.

см. здесь пример: Экранировать символ одинарной кавычки для использования в запросе SQLite

если бы это был sql-сервер и .NET, я бы предложил использовать параметры запроса или команды, не уверенные в java и sqlite

Я исправляю это написанием «два» вместо одного. Что-то вроде этого:

Main.execute("INSERT INTO Projektname(projektname) VALUES(''" + txtFd_name.getText() + "'');");

Другие вопросы по теме