यह ड्राइवर का उपयोग कर रहे सहित कई कारणों से, की वजह से हो सकता है।
क) कुछ ड्राइवरों नेस्टेड बयान अनुमति नहीं है। यदि आपका ड्राइवर जेडीबीसी 3.0 का समर्थन करता है तो आपको स्टेटमेंट ऑब्जेक्ट बनाते समय तीसरा पैरामीटर देखना चाहिए। उदाहरण के लिए, मुझे जेबर्ड ड्राइवर के साथ फायरबर्ड में भी यही समस्या थी, लेकिन कोड पोस्टग्रेस ड्राइवर के साथ ठीक काम करता था। फिर मैंने createStatement विधि कॉल में तीसरा पैरामीटर जोड़ा और इसे ResultSet.HOLD_CURSORS_OVER_COMMIT पर सेट किया, और कोड भी फायरबर्ड के लिए ठीक काम करना शुरू कर दिया।
static void testNestedRS() throws SQLException {
Connection con =null;
try {
// GET A CONNECTION
con = ConexionDesdeArchivo.obtenerConexion("examen-dest");
String sql1 = "select * from reportes_clasificacion";
Statement st1 = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
ResultSet rs1 = null;
try {
// EXECUTE THE FIRST QRY
rs1 = st1.executeQuery(sql1);
while (rs1.next()) {
// THIS LINE WILL BE PRINTED JUST ONCE ON
// SOME DRIVERS UNLESS YOU CREATE THE STATEMENT
// WITH 3 PARAMETERS USING
// ResultSet.HOLD_CURSORS_OVER_COMMIT
System.out.println("ST1 Row #: " + rs1.getRow());
String sql2 = "select * from reportes";
Statement st2 = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// EXECUTE THE SECOND QRY. THIS CLOSES THE FIRST
// ResultSet ON SOME DRIVERS WITHOUT USING
// ResultSet.HOLD_CURSORS_OVER_COMMIT
st2.executeQuery(sql2);
st2.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs1.close();
st1.close();
}
} catch (SQLException e) {
} finally {
con.close();
}
}
बी) आपके कोड में एक बग हो सकता है। याद रखें कि आप स्टेटमेंट ऑब्जेक्ट का पुन: उपयोग नहीं कर सकते हैं, एक बार जब आप एक ही कथन ऑब्जेक्ट पर कोई क्वेरी निष्पादित कर लेते हैं, तो कथन से जुड़े सभी खुले परिणाम बंद होते हैं। सुनिश्चित करें कि आप कथन बंद नहीं कर रहे हैं।
अपने कोड की एक सूची जोड़ें। – JeeBee