2010-02-13 3 views
5
में जावा का उपयोग कर चर

मैं क्या करने की कोशिश कर रहा था:सम्मिलित जावा एसक्यूएल

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

त्रुटि अल्पविराम

याद आ रही है

कृपया मदद

+2

जावा में SQL कथन के साथ काम करने का यह सबसे खराब तरीका है। सही तरीके से बलुस के जवाब देखें। –

उत्तर

26

यह वास्तव में जिस तरह से आप का निर्माण करना चाहिए रहे हैं नहीं है और चर के साथ एक SQL INSERT क्वेरी निष्पादित करें। यह न केवल SQL injection attacks के लिए प्रवण है, लेकिन यह भी सुंदर है .. बोझिल;) संभवतः एक मूल्य में एक सिंगलक्वॉट होता है और आपकी क्वेरी को वाक्यगत रूप से अमान्य होने का कारण बनता है।

बस एक एसक्यूएल स्ट्रिंग में चर-संक्रमित चर नहीं करें। इसके बजाय, PreparedStatement (tutorial here) का प्रयोग ? के साथ SQL स्ट्रिंग में चर के लिए प्लेसहोल्डर के रूप में करें। इस तरह से आप पूर्ण रूप से SQL क्वेरी (Date और InputStream सहित) को एसक्यूएल स्टेटमेंट में स्ट्रिंग्स में वर्णों के बारे में चिंता किए बिना पूर्ण रूप से SQL क्वेरी (और इस प्रकार एसक्यूएल इंजेक्शन जोखिमों को भी प्रेरित कर सकते हैं) को अच्छी तरह से तोड़ सकते हैं।

यहाँ एक किकऑफ़ अपने मूल SQL क्वेरी के आधार पर उदाहरण है:

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

बुनियादी JDBC उचित तरीके से उपयोग करने के बारे में अधिक जानने के लिए, आपको this article उपयोगी मिल सकता है।

उम्मीद है कि इससे मदद मिलती है।

3

आपको स्ट्रिंग्स के निर्माण के बजाय प्रीपेयरस्टेटमेंट्स का उपयोग करना चाहिए। वे तेज़ी से हैं और उद्धरण और मूल्यों से बचने से संबंधित कई नुकसान का ख्याल रखते हैं।

0

अन्य सभी की तरह, आप वास्तव में इसे कई कारणों से तैयार किए गए स्टेटमेंट का उपयोग करने के लिए परिवर्तित करना चाहिए। आपको सबसे अधिक त्रुटि मिल रही है (आपने सटीक ओआरए त्रुटि पोस्ट नहीं की है) क्योंकि आप स्ट्रिंग प्रकार मानों में गुजर रहे हैं, लेकिन आपने उन्हें अपनी हार्ड कोडित क्वेरी में सिंगल कोट्स में लपेटा नहीं है।

तो textual_description और 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); 

सूचना एकल अब उन मूल्यों को आसपास के उद्धरण।

+0

और हालांकि खुद को एसक्यूएल इंजेक्शन के रूप में खोलने के रूप में बुरा नहीं है, इस तरह तारों का निर्माण पसंदीदा तरीका नहीं है ;-) उदाहरण के लिए एक स्ट्रिंगबिल्डर एक और तरीका है। – Marged