java. sql .SQLSyntaxErrorException: синтаксическая ошибка: обнаружен "St \ u00f6rungen" - PullRequest
0 голосов
/ 30 января 2020

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

Я уже закодировал свой проект в UTF-8, но моя База данных Derby, кажется, не понимает эти -> " Ä, Ö, Ü "

Как я могу это исправить? Я не хочу ставить "ae, oe, ue"

Вот пример, где вещи начинают происходить:

st.executeUpdate("Insert into Scoarboard(Name,Wirkung,Ursprung,Stoffklasse,Schadenspot,Risiken,Legalitaet,NutzungMedi,NutzungGenuss,Konsum) "
                + "values (- Cannabis (Marihuana),- Sedativa/Hypnotika,- biogenpflanzlich,- Cannabinoide,"
                + "- 20/100,- Schwindel/übelkeit\r\n- Müdigkeit\r\n- Herzrasen\r\n- psychische Störungen,"
                + "- legal (verschreibungspflichtig),- Schmerzlindernd\r\n- Angstlösend\r\n- Reduziert Wachstum von Tumorzellen\r\n"
                + "- Entkrampfend\r\n- Antipsychotisch\r\n,- Appetitanregend\r\n- Euphorisierend\r\n- Entspannend\r\n,"  
                + "- Lunge (Joint)\r\n- Magen-Darm-Trakt (Gebäck)\r\n- Mundschleimhäute (Tinktur)\r\n)");

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Первое использование PreparedStatement. Это позволяет вводить поля типа int для целого числа. Также он экранирует строки, содержащие апостроф, backsla sh или разрывы строк (\r\n), и помогает со специальными символами.

String sql = "INSERT INTO Scoarboard(Name,Wirkung,Ursprung,Stoffklasse,Schadenspot,Risiken,"
                + "Legalitaet,NutzungMedi,NutzungGenuss,Konsum) "
                + "VALUES(?,?,?,?,?,?,?,?,?,?)";
try (PreparedStatement st = connection.prepareStatement(sql)) {
    st.setString(1, "Cannabis (Marihuana)");
    st.setString(2, "Sedativa/Hypnotika");
    st.setString(3, "biogenpflanzlich");    
    st.setString(4, "Cannabinoide");
    st.setString(5, "20/100");
    st.setString(6, "Schwindel/übelkeit\r\nMüdigkeit\r\nHerzrasen\r\npsychische Störungen");
    st.setString(7, "legal (verschreibungspflichtig)");
    st.setString(8, "Schmerzlindernd\r\nAngstlösend\r\n"
                + "Reduziert Wachstum von Tumorzellen\r\n"
                + "Entkrampfend\r\n- Antipsychotisch\r\n");
    st.setString(9, "Appetitanregend\r\nEuphorisierend\r\nEntspannend\r\n");
    st.setString(10, "Lunge (Joint)\r\nMagen-Darm-Trakt (Gebäck)\r\n"
                + "Mundschleimhäute (Tinktur)\r\n");

    st.executeUpdate();
}

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

Синтаксис попытки с ресурсами try(X x = open()) { ... } гарантирует, что x закрывается даже при возврате или исключении внутри.

(строковые константы в SQL обычно дано с апострофом WHERE Name LIKE 'Can%'.)

0 голосов
/ 30 января 2020

Во-первых, я рекомендую посмотреть, какой формат ANSI, если формат ANSI не соответствует требуемому, вы должны изменить его

ФОРМАТ ANSI

Также я рекомендую проверить кодировку по умолчанию

кодировку по умолчанию и изменить

Также я рекомендую использовать процедуры, потому что это помогает сохранять данные, также, возможно, вы не необходимо изменить

Это пример процедуры в SQL SERVER

USE prueba;  
GO  
CREATE PROCEDURE dbo.aaaa

    @be_state int,   
    @resultado int OUTPUT

AS   

    BEGIN TRY


              INSERT INTO prueba.dbo.aaaa(be_state) VALUES (
              @be_state); 

         SET @resultado=1

    END TRY
    BEGIN CATCH
       SELECT  
           ERROR_NUMBER() AS ErrorNumber  
          ,ERROR_SEVERITY() AS ErrorSeverity  
          ,ERROR_STATE() AS ErrorState  
          ,ERROR_PROCEDURE() AS ErrorProcedure  
          ,ERROR_LINE() AS ErrorLine  
          ,ERROR_MESSAGE() AS ErrorMessage; 
       SET @resultado=2;
       RETURN @resultado;
    END CATCH; 




GO  

Пример подключения к базе данных

package com.prueba.conexiones;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.log4j.Logger;

public class Conexion implements Serializable {

    private static final long serialVersionUID = -3723843422114279249L;
    static Logger logger = Logger.getLogger(Conexion.class);

    public Connection conectar() throws ClassNotFoundException, SQLException {

        StringBuilder cadenaConexion;
        Connection conexion;

        cadenaConexion = new StringBuilder();
        cadenaConexion.append("jdbc:sqlserver://");
        cadenaConexion.append("127.0.0.1");
        cadenaConexion.append(":");
        cadenaConexion.append(9990);
        cadenaConexion.append(";");
        cadenaConexion.append("databaseName=");
        cadenaConexion.append("PRUEBA");
        cadenaConexion.append(";");
        cadenaConexion.append("user=");
        cadenaConexion.append("PRUEBA");
        cadenaConexion.append(";");
        cadenaConexion.append("password=");
        cadenaConexion.append("12345678");
        cadenaConexion.append(";");
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        conexion = DriverManager.getConnection(cadenaConexion.toString());

        return conexion;

    }

    public void Desconectar(Connection conexion) throws ClassNotFoundException {
        try {
            logger.debug("Comenzo el metodo desconectar() de la clase conexion ");

            if (conexion != null) {
                conexion.close();
            }

            logger.debug("Termino el metodo desconectar() de la clase conexion ");
        } catch (SQLException e) {
            logger.error("Error inexperado 0xC02643 CT" + e.getMessage(), e);
        }
    }

}

Наконец, чтобы вставить данные следующие

package com.prueba.insert;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.log4j.Logger;

public class ProcedimientoPrueba{

    static Logger logger = Logger.getLogger(ProcedimientoPrueba.class);
    private Connection conexion;
    private CallableStatement procedimiento;
    private boolean estado;

    public void conectarProcedimiento() throws SQLException {
        procedimiento = conexion.prepareCall("{call dbo.Prueba(?, ?)}");
    }

    public synchronized void insertarToBaseDatos() throws SQLException {
        estado = false;
        procedimiento.setInt(1, 1);
        procedimiento.registerOutParameter(2, java.sql.Types.INTEGER);
        procedimiento.execute();
        if (procedimiento.getInt(2) == 1) {
            estado = true;
        } else {
          System.out.println("Errro :(");
        }

    }


}
...