2010-02-13 19 views
5

ben yapmaya çalışıyordum:Java'yı Java'da SQL kullanarak ekle

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

Hata virgül

Yardım Lütfen eksik

+2

Bu, Java'daki SQL deyimleriyle çalışmak için en kötü yoldur. BalusC'nin cevabını doğru şekilde görün. –

cevap

26

Lütfen Yardım ve değişkenlerle bir SQL INSERT sorgusu yürütür. Bu sadece SQL injection attacks için eğilimli değil, aynı zamanda güzel .. hantal;) Muhtemelen bir değer bir singlequote içeriyor ve sorgunuzun sözdizimsel olarak geçersiz olmasına neden oldu.

Sadece değişkenleri bir SQL dizesine dizgileyeyle birleştirmeyin. Bunun yerine, ? ile birlikte SQL dizesindeki değişkenin yer tutucusu olarak PreparedStatement (tutorial here) kullanın. Bu şekilde, SQL sorgusunu sözdizimsel olarak bozabilecek (ve dolayısıyla SQL enjeksiyon risklerini de indükleyebilecek) karakter dizileriyle ilgili endişe duymadan, tam bir Java nesnesini (Date ve InputStream dahil!) Bir SQL deyiminde değer dizinine ekleyebilirsiniz.

bölümde, orijinal SQL sorgusunun dayalı bir başlama örnek:

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

temel JDBC uygun şekilde kullanma hakkında daha fazla bilgi edinmek için, this article kullanışlı bulabilir.

Bu yardımcı olur umarım.

3

Dizeleri oluşturmak yerine PrepairedStatements kullanmayı düşünmelisiniz. Daha hızlıdırlar ve alıntılama ve kaçan değerlerle ilgili birçok tuzağa dikkat ederler.

0

Diğerlerinin de dediği gibi, bazı nedenlerden ötürü gerçekten PreparedStatements'ı kullanacak şekilde dönüştürmeniz gerekir. Dize türü değerlerini geçtiğiniz için büyük olasılıkla hatayı alıyorsunuz (tam ORA hatasını göndermediniz), ancak bunları sabit kodlanmış sorgunuzda tek tırnak içine almadınız.

ise yalnızca String tipi sütunlar sorgusunda, sonra sorgu böyle bakmak gerekir textual_description ve for_description:

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

Bildirimi şimdi bu değerleri çevreleyen tek tırnak.

+0

Ve sql enjeksiyon için kendini açmak kadar kötü olmasa da, bu şekilde dizeleri oluşturmak tercih edilen yol değildir ;-) Örneğin bir StringBuilder kullanmak daha etkilidir. – Marged

İlgili konular