2011-06-22 9 views
6

जेडीबीसी में Connection, Statement, और ResultSet प्रकारों में प्रत्येक getWarnings() विधि है जो उस प्रकार की वस्तुओं से जुड़ी पहली चेतावनी उत्पन्न करने के लिए निर्दिष्ट है। दूसरी और बाद की चेतावनियां, यदि वे मौजूद हैं, तो पहली चेतावनी पर जंजीर हैं (यदि यह भी मौजूद है, null कोई चेतावनी नहीं होने पर उत्पादित होता है)।जेडीबीसी के साथ कनेक्शन, स्टेटमेंट्स और परिणामसेट्स पर getWarnings() को कब कॉल करें?

चश्मे कहते हैं कि कुछ प्रकार के कार्यों के बाद इन प्रकार की वस्तुओं से जुड़ी चेतावनियां साफ़ हो जाती हैं। उदाहरण के लिए ResultSet पर चेतावनियां साफ़ की जाती हैं जब प्रत्येक नई पंक्ति पढ़ी जाती है।

SQLWarning प्रकार SQLException का उप प्रकार है। तो एक चेतावनी की उपस्थिति एक अपवाद द्वारा इंगित किया जाएगा? और अपवाद के रनटाइम प्रकार SQLWarning है, तो उस अपवाद को संबंधित ऑब्जेक्ट पर जंजीर किया जाएगा?

मैं क्या सोच रहा हूँ इस है, और यह ड्राइवर हो सकती है, कैसे मैं जानता हूँ कि जब मैं getWarnings() फोन और एक गैर null प्रतिक्रिया की अपेक्षा करना चाहिए? एक और तरीका रखो, एक जेडीबीसी ऑब्जेक्ट पर एक चेतावनी मौजूद है और उस ऑब्जेक्ट को अपवाद फेंकने के बाद ही getWarnings() के साथ उपलब्ध है? (और वह अपवाद चेतावनी है?)

क्या मुझे प्रत्येक जेडीबीसी ऑपरेशन के बाद चेतावनियों को देखने के लिए getWarnings() पर कॉल करना चाहिए "बस सुनिश्चित करें" यदि मेरा लक्ष्य हर चेतावनी का पालन करना है?

उत्तर

4

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

[reference]

सच कहूं तौर पर, मैं कभी नहीं पाया है अपने आप को चेतावनी हमेशा के लिए जाँच। हो सकता है कि मैंने कभी भी गंभीर सामग्री नहीं की हो।

7

SQLWarning ऑब्जेक्ट्स SQLException का उप-वर्ग है जो डेटाबेस एक्सेस चेतावनियों से निपटता है।

चेतावनियां किसी एप्लिकेशन के निष्पादन को रोक नहीं देती हैं, अपवादों के अनुसार; वे बस उपयोगकर्ता को सतर्क करते हैं कि नियोजित के रूप में कुछ नहीं हुआ।

एक चेतावनी एक Connection वस्तु पर सूचना दी जा सकती है, (PreparedStatement और CallableStatement वस्तुओं सहित) एक Statement वस्तु, या एक ResultSet वस्तु।

SQLWarning warning = stmt.getWarnings(); 
if (warning != null) 
{ 
    System.out.println(\"n---Warning---n\"); 
    while (warning != null) 
    { 
     System.out.println(\"Message: \" + warning.getMessage()); 
     System.out.println(\"SQLState: \" + warning.getSQLState()); 
     System.out.print(\"Vendor error code: \"); 
     System.out.println(warning.getErrorCode()); 
     System.out.println(\"\"); 
     warning = warning.getNextWarning(); 
    } 
} 
3

हाँ, आप स्पष्ट रूप से getWarnings करना होगा यदि आप वास्तव में चाहते हैं:

इन कक्षाओं में से प्रत्येक एक getWarnings विधि है, जिसमें आप पहली चेतावनी को देखने के लिए आह्वान करना चाहिए बुला वस्तु को सूचना दी है हर चेतावनी का पालन करने के लिए। लेकिन आप ऐसा क्यों करना चाहते हैं?

वैकल्पिक रूप से वसंत के जेडीबीसी टेम्पलेट आपको चेतावनियां लॉगिंग करने या चेतावनी देने पर SQLWarningException फेंकने का विकल्प देता है।डिफ़ॉल्ट व्यवहार चेतावनी लॉग करना है क्योंकि, ठीक है, वे चेतावनियां हैं। उम्मीद है कि यह आपके उद्देश्यों के लिए भी पर्याप्त है।

+1

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

+1

हां, वही जेडीबीसी विधियों को बुलाया जाएगा। मेरा मतलब था कि मैंने कभी भी खुद को चेतावनियों की स्पष्ट रूप से जांच नहीं की है। मैंने आपको चेतावनियां लॉग करने का एक आसान तरीका प्रदान करने का भी प्रयास किया। – jtoberon

+1

कभी-कभी "चेतावनियां" वास्तव में बहुत गंभीर हो सकती हैं। सालों पहले मैंने एक परियोजना पर काम किया जो साइबेस का इस्तेमाल करता था, और यह पता चला कि 'NUM.000IC (n, 2)' कॉलम में "37.000" जैसे संख्यात्मक मान डालने से पता चलता है कि सम्मिलित की पूरी पंक्ति को अनदेखा किया जाएगा, लेकिन उत्पादन होगा एक चेतावनी, अपवाद फेंक नहीं। यह एक दुर्लभ पर्याप्त घटना थी कि हमारे परीक्षणों ने इसे पकड़ नहीं लिया था, और यह तब तक नहीं था जब तक कोड कुछ हफ्तों तक उत्पादन में नहीं था जब हमने पाया कि हमारे कुछ आवेषण चुपचाप विफल रहे थे। हमने सभी जेडीबीसी ऑब्जेक्ट्स को रैपर के साथ लपेटकर समाप्त किया जो प्रत्येक 'एसक्यूएलवार्निंग' को फेंक देगा। –