2010-02-13 12 views
5

je tentais de faire:Insérer une variable Java en utilisant Java dans 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); 

Erreur manque une virgule

S'il vous plaît Aide

+2

C'est la pire façon de travailler avec des instructions SQL en Java. Voir la réponse de BalusC pour la bonne manière. –

Répondre

26

Ce n'est pas vraiment la façon dont vous êtes censé construire et exécuter une requête SQL INSERT avec des variables. Ce n'est pas seulement sujet à SQL injection attacks, mais il est également joli .. lourd;) Peut-être une valeur contenait une seule citation et a provoqué votre requête syntaxiquement invalide.

Ne faites pas de chaîne de concaténation de variables dans une chaîne SQL. Au lieu de cela, utilisez PreparedStatement (tutorial here) en combinaison avec ? comme espace réservé pour la variable dans la chaîne SQL. De cette façon, vous pouvez facilement placer des objets Java complets (y compris Date et InputStream!) Dans une instruction SQL par index de valeur sans vous soucier des caractères dans les chaînes qui peuvent casser syntaxiquement la requête SQL (et ainsi induire des risques d'injection SQL).

Voici un exemple de coup d'envoi en fonction de votre requête SQL d'origine:

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(); 
    } 
} 

Pour en savoir plus sur l'utilisation de la bonne façon JDBC de base, vous pouvez trouver this article utile.

Espérons que cela aide.

3

Vous devriez envisager d'utiliser PrepairedStatements au lieu de créer des chaînes. Ils sont plus rapides et prennent en charge de nombreux pièges liés à la citation et à l'évasion des valeurs.

0

Comme tous les autres disent, vous devriez vraiment le convertir pour utiliser PreparedStatements pour un certain nombre de raisons. Vous obtenez probablement l'erreur (vous n'avez pas envoyé l'erreur ORA exacte) car vous transmettez des valeurs de type String, mais vous ne les avez pas enveloppées dans des guillemets simples dans votre requête codée en dur.

Si textual_description et for_description où les seules colonnes de type String dans votre requête, votre requête aurait besoin de ressembler à ceci:

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); 

Notez les guillemets simples autour de ces valeurs maintenant.

+0

Et bien que ce ne soit pas aussi grave que de s'ouvrir à l'injection sql, construire des chaînes de cette façon n'est pas la méthode préférée ;-) Utiliser par exemple un StringBuilder est bien plus efficace. – Marged

Questions connexes