2010-02-13 15 views
5

Ich habe versucht zu tun:Insert Java Variable mit Hilfe von Java in SQL

String sql = "INSERT INTO CURRENT_WEATHER_US VALUES("+city_code+", 
"+object.city+","+object.region+","+object.country+","+object.wind_chill+", 
"+object.wind_direction+", "+object.wind_speed+","+object.humidity+","+object.visibility+", 
"+object.pressure+","+object.rising+", 
"+object.sunrise+","+object.sunset+","+object.textual_description+", 
"+object.condition_code+","+object.temp+","+object.for_temp_high+", 
"+object.for_temp_low+","+object.for_description+","+object.forecast_code+")"; 

    stmt.execute(sql); 

Fehler Komma fehlt

Hilfe

Bitte

+2

Dies ist die schlechteste Möglichkeit, mit SQL-Anweisungen in Java zu arbeiten. Siehe die Antwort von BalusC für den richtigen Weg. –

Antwort

26

Das ist nicht wirklich die Art, wie man eigentlich sind zu konstruieren und Führen Sie eine SQL INSERT-Abfrage mit Variablen aus. Dies ist nicht nur anfällig für SQL injection attacks, aber es ist auch ziemlich .. umständlich;) Möglicherweise enthielt ein Wert eine einzelne Zahl und verursacht Ihre Abfrage syntaktisch ungültig.

Nur String-verketten Variablen in eine SQL-Zeichenfolge. Verwenden Sie stattdessen PreparedStatement (tutorial here) in Kombination mit ? als Platzhalter für die Variable in der SQL-Zeichenfolge. Auf diese Weise können Sie vollwertige Java-Objekte (einschließlich Date und InputStream!) In eine SQL-Anweisung von Wertindex einfügen, ohne sich Gedanken über Zeichen in Strings zu machen, die die SQL-Abfrage syntaktisch brechen (und damit auch SQL-Injection-Risiken induzieren).

hier ein Kickoff Beispiel ist auf der Grundlage Ihrer ursprünglichen SQL-Abfrage:

private static final String SQL_INSERT = "INSERT INTO CURRENT_WEATHER_US" 
    + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

public void create(String cityCode, Weather weather) throws SQLException { 
    try (
     Connection connection = database.getConnection(); 
     PreparedStatement statement = connection.prepareStatement(SQL_INSERT); 
    ) { 
     statement.setString(1, cityCode); 
     statement.setString(2, weather.getCity()); 
     statement.setString(3, weather.getRegion()); 
     // ... 
     statement.setString(20, weather.getForecastCode()); 
     statement.executeUpdate(); 
    } 
} 

Um mehr über die Verwendung Grund JDBC die richtige Art und Weise zu lernen, können Sie this article nützlich finden.

Hoffe, das hilft.

3

Sie sollten PrepaidStatements verwenden, anstatt Strings zu erstellen. Sie sind schneller und kümmern sich um viele Fallstricke, die sich auf Zitate und Fluchtwerte beziehen.

0

Wie alle anderen sagen, sollten Sie es aus verschiedenen Gründen in PreparedStatements konvertieren. Wahrscheinlich erhalten Sie den Fehler (Sie haben den genauen ORA-Fehler nicht veröffentlicht), weil Sie String-Typenwerte übergeben, aber Sie haben sie nicht in einfache Anführungszeichen in Ihrer hartcodierten Abfrage eingefügt.

Wenn textual_description und for_description wo die einzigen String-Typ-Spalten in Ihrer Abfrage, dann Ihre Abfrage wie folgt aussehen müsste:

String sql = "INSERT INTO CURRENT_WEATHER_US VALUES(" + 
    city_code + ", " + 
    object.city + ", " + 
    object.region + ", " + 
    object.country + ", " + 
    object.wind_chill + ", " + 
    object.wind_direction + ", " + 
    object.wind_speed + ", " + 
    object.humidity + ", " + 
    object.visibility + ", " + 
    object.pressure + ", " + 
    object.rising + ", " + 
    object.sunrise + ", " + 
    object.sunset + ", " + 
    "'" + object.textual_description + "', " + 
    object.condition_code + ", " + 
    object.temp + ", " + 
    object.for_temp_high + ", " + 
    object.for_temp_low + ", " + 
    "'" + object.for_description + "', " + 
    object.forecast_code + 
    ")"; 

stmt.execute(sql); 

Beachten Sie die einfachen Anführungszeichen, diese Werte jetzt umgibt.

+0

Und obwohl nicht so schlecht wie sich selbst zu SQL-Injektion zu öffnen, ist das Erstellen von Strings auf diese Weise nicht der bevorzugte Weg ;-) Zum Beispiel ist ein StringBuilder viel effizienter. – Marged