2010-11-22 15 views
75

संभव डुप्लिकेट की आईडी प्राप्त करें:
How to get the insert ID in JDBC?MySQL और जावा - पिछले डाला मूल्य (JDBC)

हाय, मैं के माध्यम से बाहर जावा डेटाबेस पर कनेक्ट करने के लिए JDBC उपयोग कर रहा हूँ।

अब, मैं कुछ सम्मिलित क्वेरी करता हूं, और मुझे अंतिम डालने वाले मान की आईडी प्राप्त करने की आवश्यकता है (इसलिए, stmt.executeUpdate के बाद)।

मैं SELECT id FROM table ORDER BY id DESC LIMIT 1 की तरह कुछ की जरूरत नहीं है, क्योंकि मैं संगामिति समस्या हो सकती है।

मैं बस (वक्तव्य के अपने उदाहरण के बारे में) पिछले प्रविष्टि से जुड़े आईडी पुनः प्राप्त करने की जरूरत है।

मैं इस कोशिश की, लेकिन यह JDBC पर काम नहीं करता लगता है: हर बार risultato = -1

public Integer insertQueryGetId(String query) { 
    Integer numero=0; 
    Integer risultato=-1; 
    try { 
     Statement stmt = db.createStatement(); 
     numero = stmt.executeUpdate(query); 

     ResultSet rs = stmt.getGeneratedKeys(); 
     if (rs.next()){ 
      risultato=rs.getInt(1); 
     } 
     rs.close(); 

     stmt.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     errore = e.getMessage(); 
     risultato=-1; 
    } 
    return risultato; 
} 

वास्तव में, है, और मैं java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

मिल मैं इस समस्या का समाधान कैसे कर सकते हैं? धन्यवाद Stackoverflow लोग :)

+0

मेरा प्रश्न देखें: http://stackoverflow.com/questions/4224228/preparedstatement-with-statement-return-generated-keys –

+0

डुप्लिकेट [जेडीबीसी में सम्मिलित आईडी कैसे प्राप्त करें?] (Http: // stackoverflow .com/प्रश्न/1915166/कैसे करने वाली मिलता-डालें-आईडी-इन-JDBC) – BalusC

उत्तर

147

तुम सिर्फ नहीं बदल सकते हैं:

numero = stmt.executeUpdate(query); 

रहे हैं:

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); 

JDBC Statement इंटरफेस के लिए दस्तावेज़ पर एक नजर डालें।

अद्यतन: स्पष्ट रूप से इस उत्तर के बारे में बहुत भ्रम है, लेकिन मेरा अनुमान यह है कि जो लोग भ्रमित हैं, वे सवाल के संदर्भ में इसे पढ़ नहीं रहे हैं। यदि आप उस कोड को लेते हैं जिसे ओपी ने अपने प्रश्न में प्रदान किया है और एकल लाइन (लाइन 6) को प्रतिस्थापित किया है जो मैं सुझाव दे रहा हूं, तो सबकुछ काम करेगा। numero चर पूरी तरह से अप्रासंगिक है और इसके मान को सेट होने के बाद कभी नहीं पढ़ा जाता है।

+1

आप रॉक !!! Heheh, im यह चेतावनी संदेश को पढ़ने के लिए इतना सक्षम नहीं :) – markzzz

+1

+1 के लिए 'RETURN_GENERATED_KEYS' – bizzr3

+0

हाँ, यह वास्तव में काम नहीं करता। रिकॉर्ड की एक जोड़ी डालने की कोशिश करो, (काट-छांट नहीं) उन सभी को हटा सकते हैं और अगर सही आईडी पुनर्प्राप्त है यह देखने के;) – Pierre

108

वैकल्पिक रूप से आप कर सकते हैं:

Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
numero = stmt.executeUpdate(); 

ResultSet rs = stmt.getGeneratedKeys(); 
if (rs.next()){ 
    risultato=rs.getInt(1); 
} 

लेकिन अपने परिदृश्य के लिए बजाय शॉन उज्ज्वल के जवाब का उपयोग करें।

+0

बहुत बहुत धन्यवाद! मुझे नहीं पता था कि जेडीबीसी का उपयोग करना संभव था, मैं तालिका में कई पंक्तियों को डालने पर सभी जेनरेट की गई कुंजी प्राप्त करने की कोशिश कर रहा था। मुझे वास्तव में उन ऑटो वृद्धि वाली कुंजी की आवश्यकता थी, और 'LAST_INSERT_ID(); + 1' मुझे पूरी तरह भरोसा नहीं था, यह किसी भी तरह से सुरक्षित होना चाहिए! – Yeti

+2

मुझे पता है कि मैं 2 साल देर से हूं, लेकिन धन्यवाद :) यह काम किया: डी – Rorchackh

+1

धन्यवाद आदमी, यह एकमात्र तरीका था जिसने काम किया! :) – Nick

संबंधित मुद्दे