2012-04-03 9 views
5

मैं इस प्रकार एक प्रश्न है का उपयोग कर जावा में एक जनरेट की गई कुंजी ढूंढने में असमर्थ:PreparedStatement के getGeneratedKeys()

String SQL = "insert into table (id, name) values (sequence.nextval, ?)"; 

मैं तो इस तरह की एक PreparedStatement बनाने:

//initiate connection, statement etc 
pStatement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); 
pStatement.setString(1,'blabla'); 

pStatement.executeUpdate(); 
ResultSet rs = pStatement.getGeneratedKeys(); 

while (rs.next()){ 
    //debugging here to see what rs has 
} 

जब क्रियान्वित करने और डिबगिंग में वह डीबग पॉइंट, मुझे लगता है कि मेरे परिणामसेट में केवल एक कुंजी है, एक स्ट्रिंग - आईडी की तरह मुझे बिल्कुल उम्मीद नहीं है। डेटाबेस की जांच करते समय सबकुछ ठीक काम करता है, आईडी डाली जाती है और सबकुछ मिलता है। getGeneratedKeys() के बारे में कुछ है; जो मुझे भ्रमित कर रहा है।

मैं क्या गलत कर रहा हूं?

अग्रिम

+2

आप उत्पन्न कुंजी 'का उपयोग नहीं कर रहे हैं, तो आप सिर्फ अपने सम्मिलित में एक जनरेटर का उपयोग कर रहे बयान। 'getGeneratedKeys()' का उपयोग आईएनएसईआरटी (पहचान कॉलम द्वारा या ट्रिगर के माध्यम से) के रूप में डीबी द्वारा उत्पन्न कुंजी को वापस करने के लिए किया जाता है। –

उत्तर

8

मुझे उम्मीद है कि एक स्ट्रिंग की तरह दिखने वाली "कुंजी" ROWID है - यह एकमात्र कुंजी है जो डेटाबेस सीधे उत्पन्न कर रहा है। आपको अपना id कॉलम वापस पाने के लिए इसे बदलने में सक्षम होना चाहिए (इसे शायद जेडीबीसी ड्राइवर का मामूली हालिया संस्करण चाहिए)।

//initiate connection, statement etc 
String generatedColumns[] = {"ID"}; 
pStatement = connection.prepareStatement(SQL, generatedColumns); 
pStatement.setString(1,'blabla'); 

pStatement.executeUpdate(); 
ResultSet rs = pStatement.getGeneratedKeys(); 

while (rs.next()){ 
    //debugging here to see what rs has 
} 

तुम भी आपकी क्वेरी को बदल सकता है स्पष्ट रूप से RETURNING खंड

String SQL = "insert into table (id, name) " + 
      " values (sequence.nextval, ?) " + 
      " returning id into ?"; 
+0

धन्यवाद। मैंने जेनरेट कॉलम को शामिल करने के लिए अपना पहला विकल्प चुना है। दरअसल, मेरे परिणामसेट ने मुझे कुछ पंक्ति दी जो मुझे समझ में नहीं आया था, लेकिन अब मैं स्ट्रिंग के साथ पास करता हूं [] {"id"} नई जेनरेट की गई आईडी देता है। – arnehehe

1

धन्यवाद अगर यह काम नहीं कर रहा है, समस्या sequence.nextval साथ हो सकता है। ऐसा लगता है कि आप इसका उपयोग कर रहे हैं, तो आप तकनीकी रूप से

1

को स्वत: उत्पन्न नहीं कर रहे हैं। मुझे पूरा यकीन है कि getGeneratedKeys किसी कुंजी के मान को वापस नहीं करेगा जो अनुक्रम के अगले मान के साथ प्रारंभ किया गया था। दरअसल, इस मामले में, डेटाबेस स्वयं कुंजी उत्पन्न नहीं करता है (जैसे यह एक ऑटो-वृद्धि कॉलम के साथ होगा)।

आप जनरेट की गई कुंजी जानना चाहते हैं, तो एक पहली क्वेरी निष्पादित करें:

select sequence.nextval from dual 

और उसके बाद यह पहली क्वेरी के परिणाम का उपयोग अपने तैयार बयान निष्पादित करने के लिए:

insert into table (id, name) values (?, ?) 
1

मुझे लगता है कि इस:

pStatement.setString('blabla'); 

होना चाहिए:

pStatement.setString(1, 'blabla'); 

उम्मीद है कि यह मदद करता है।

+0

क्षमा करें - आप सही हैं। यह मेरी गलती है कि मेरे कोड को चिपकाने की नकल न करें, लेकिन कोड को अधिक आसानी से पठनीय बनाने के लिए उदाहरण को सामान्य शब्दों में टाइप करने का प्रयास करें। मेरे कोड में, हालांकि, मैंने इसे सही तरीके से किया है। तो जब आप सही होते हैं तो यह समस्या नहीं है जिसके साथ मैं संघर्ष कर रहा हूं। मैंने अपनी पोस्ट संपादित की है। – arnehehe

+0

@arnhehehe आप सही हैं, आप अपने कोड को संकलित कर सकते हैं ताकि त्रुटि नहीं हो। मेरी गलती। –

0

आपका कोड में कोई त्रुटि है जोड़ने के लिए:

pStatement = connection.prepareStatement(SQL, PreparedStatement.RETURN_GENERATED_KEYS); 
: आप PreparedStatement उपयोग कर रहे हैं के बाद से, आप अपने स्वयं के RETURN_GENERATED_KEYS निरंतर उपयोग करना चाहिए

getGeneratedKeys() फ़ंक्शन बिना किसी समस्या के निष्पादित किया जाना चाहिए, और आपको उत्पन्न कुंजी प्राप्त करने में सक्षम होना चाहिए ResultSet चर।

इस तरह से आपको अपनी पंक्ति के लिए कोई नाम निर्दिष्ट करने की आवश्यकता नहीं है (जैसे जस्टिन समाधान सुझाव देता है, जो कि बहुत अच्छा है)।

id = rs.getInt("id_row_name"); 

के बजाय:: आप केवल अगर आप का उपयोग कर लिया गया कुंजियों का उपयोग अपने पंक्ति नाम बताना होगा

id = rs.getInt(column_number); //One column for each key retrieved. 
संबंधित मुद्दे