2010-01-22 29 views
46

मुझे ResultSet ऑब्जेक्ट से डेटा प्राप्त करने में समस्या हो रही है। यहाँ मेरी कोड है:परिणाम सेट अपवाद - परिणाम सेट की शुरुआत से पहले

String sql = "SELECT type FROM node WHERE nid = ?"; 
    PreparedStatement prep = conn.prepareStatement(sql); 
    int meetNID = Integer.parseInt(node.get(BoutField.field_meet_nid)); 
    prep.setInt(1, meetNID); 

    ResultSet result = prep.executeQuery(); 
    result.beforeFirst(); 
    String foundType = result.getString(1); 

    if (! foundType.equals("meet")) { 
     throw new IllegalArgumentException(String.format("Node %d must be of type 'meet', but was %s", meetNID, foundType)); 
    } 

त्रुटि ट्रेस: ​​

Exception in thread "main" java.sql.SQLException: Before start of result set 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841) 
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5656) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5576) 
    at nth.cumf3.nodeImport.Validator.validate(Validator.java:43) 
    at nth.cumf3.nodeImport.Main.main(Main.java:38) 

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

उत्तर

117

मूल रूप से आप पहली पंक्ति से पहले कर्सर को स्थिति दे रहे हैं और फिर डेटा का अनुरोध कर रहे हैं। आपको कर्सर को पहली पंक्ति में ले जाने की आवश्यकता है।

result.next(); 
String foundType = result.getString(1); 

यदि यह कथन या लूप में ऐसा करना आम है।

if(result.next()){ 
    foundType = result.getString(1); 
} 
6

परिणाम देखने से पहले आपको परिणाम.एक्सटी() करना होगा।

ResultSet rs = stmt.executeQuery(); 
while (rs.next()) 
{ 
    int foo = rs.getInt(1); 
    ... 
} 
1

आप next() इससे पहले कि आप कॉल करने के लिए पहली पंक्ति से मानों पढ़ना शुरू कर सकते हैं। beforeFirst कर्सर को पहले पंक्ति में से पहले रखता है, इसलिए पढ़ने के लिए कोई डेटा नहीं है।

1

आप पहली पंक्ति के लिए सूचक ले जाने के लिए, डेटा के लिए पूछ रहा से पहले की जरूरत है:

result.beforeFirst(); 
result.next(); 
String foundType = result.getString(1); 
2

यदि आप एक वर्ग सभी क्वेरी तरीकों है, सम्मिलित, एक अलग पैकेज में बनाने यह बेहतर है, इसलिए बजाय प्रत्येक वर्ग में सभी प्रक्रियाओं को टाइप करने के लिए, आप बस उस वर्ग से विधि को कॉल करते हैं।

5

प्रत्येक उत्तर .next() या उपयोग करता है। पहले फर्स्ट() और फिर .next()। लेकिन क्यों नहीं:

result.first(); 

तो आप केवल पहले रिकॉर्ड में पॉइंटर सेट करते हैं और वहां से जाते हैं। यह जावा 1.2 के बाद से उपलब्ध है और मैं बस किसी ऐसे व्यक्ति के लिए इसका उल्लेख करना चाहता हूं जिसके परिणामस्वरूप एक विशिष्ट रिकॉर्ड मौजूद है।

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