Я пытаюсь вставить 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()
@khelwood escapeJava() тогда не нужен?
Да, escapeJava не нужен, если вы правильно используете параметры оператора.




Вы обязательно должны использовать здесь подготовленный оператор, который решит проблему правильного экранирования одинарной кавычки при выполнении вставки. Что-то вроде этого:
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 Это чудо, что мы не делаем больше ошибок, чем уже делаем :-)
ты, я буду использовать preparedStatement сейчас
вы должны экранировать 'двойной одинарной кавычкой, прежде чем использовать это значение в своей строковой композиции
txtFd_name.getText()
присвоить значение строковой переменной, а затем заменить «на» (дважды), и это должно работать.
см. здесь пример: Экранировать символ одинарной кавычки для использования в запросе SQLite
если бы это был sql-сервер и .NET, я бы предложил использовать параметры запроса или команды, не уверенные в java и sqlite
Я исправляю это написанием «два» вместо одного. Что-то вроде этого:
Main.execute("INSERT INTO Projektname(projektname) VALUES(''" + txtFd_name.getText() + "'');");
С
PreparedStatementвы можете использоватьsetString, и вы будете защищены от SQL-инъекций. Вы не должны пытаться вклеивать ввод непосредственно в свой запрос.