2009-01-20 12 views
9

मैं उन विचारों से डेटा पूछ रहा हूं जो परिवर्तन के अधीन हैं। मुझे यह जानने की ज़रूरत है कि crs.get******() करने से पहले कॉलम मौजूद है या नहीं। मुझे पता चला है कि मैं इस तरह के मेटाडेटा से पूछ सकता हूं कि यह देखने के लिए कि कोई डेटा मौजूद है या नहीं।कैश RowSet में कॉलम नाम मौजूद है या नहीं, यह देखने के लिए मैं कैसे जांचूं?

ResultSetMetaData meta = crs.getMetaData(); 
int numCol = meta.getColumnCount(); 

for (int i = 1; i < numCol+1; i++) 
    if(meta.getColumnName(i).equals("name")) 
     return true; 

क्या कोई कॉलम मौजूद है या नहीं, यह देखने का एक आसान तरीका है?

संपादित करें: यह डेटाबेस अज्ञेयवादी होना चाहिए। यही कारण है कि मैं डेटाबेस के बजाय CachedRowSet का संदर्भ दे रहा हूं।

उत्तर

8

आम JDBC API (कम से कम नहीं है कि मैं के बारे में पता है, या पा सकते हैं ... मैं अपने देसी टूलसेट में बिल्कुल एक ही कोड मिल गया है।)

साथ एक सरल तरीका (नहीं है) आपका कोड को पूरा नहीं कर रहा है:

ResultSetMetaData meta = crs.getMetaData(); 
int numCol = meta.getColumnCount(); 

for (int i = 1; i < numCol+1; i++) 
{ 
    if(meta.getColumnName(i).equals("name")) 
    {return true;} 

} 
return false; 

, कहा जा रहा है अगर आप मालिकाना, डेटाबेस विशिष्ट एपीआई और/या एसक्यूएल प्रश्नों का उपयोग, मुझे यकीन है कि आप एक ही बात करने का और अधिक सुरुचिपूर्ण तरीके खोजने सकता हूँ। .. लेकिन आपको प्रत्येक डेटाबेस के लिए कस्टम कोड लिखना होगा जिसके साथ आपको निपटने की ज़रूरत है। अगर मैं आप थे तो मैं जेडीबीसी एपीआई के साथ रहूंगा।

क्या आपके प्रस्तावित समाधान के बारे में कुछ ऐसा है जो आपको लगता है कि यह गलत है? यह मेरे लिए काफी आसान लगता है ...

+0

मैं cachedRowSet के लिए नया हूँ, मैं सिर्फ इस समझ के रूप में मैं अपने सवाल लिख रहा था। इस सवाल को एक सुसंगत तरीके से पूछने से मुझे अलग-अलग शब्दों में लगता है। बस यह सुनिश्चित कर लें कि मैं सही रास्ते पर रह रहा हूं। – WolfmanDragon

+0

आप स्तंभों का एक बहुत के लिए देखने की जरूरत है, तो आप हमेशा इस वापसी हो सकती है एक 'सेट '' getColumnName (i) 'विधि कॉल की आबादी। इस तरह, आप 'को set.contains (myCol)' के बजाय सब कुछ इस पर पुनरावृत्ति उल्लेख कर सकते हैं। – corsiKa

1

कौन सा डाटाबेस?

मुझे लगता है कि ओरेकल में ऐसे टेबल हैं जहां कॉलम सूचीबद्ध हैं।

मैं अगर यह भी विचारों के लिए काम याद नहीं है, लेकिन मुझे लगता है कि वे करते हैं लगता है, यह था की तरह कुछ:

select colum_name from all_views where view_name like 'myview' 

या

select name from all_objects where object_name like 'myview' and object_type='view' 

मैं बिल्कुल वाक्य रचना याद नहीं है । हालांकि आपके पास विशाल अनुमतियां होनी चाहिए।

प्रत्येक आरडीबीएमएस में कुछ समान होना चाहिए।

आप क्वेरी प्रदर्शन कर सकते हैं

select * from myView where 1 = 0 ; 

और मेटाडाटा से कॉलम, मिल क्या आप इसे डेटा लाते समय से पहले जानना चाहते हैं कि कॉलम मौजूद हैं से बचने के लिए चाहते हैं।

+0

यह डेटाबेस नास्तिक हो गया है। मैंने ओरेकल के साथ कभी काम नहीं किया है, लेकिन जल्द ही ऐसा कर सकता है। ओरेकल विचारों के बारे में कुछ अच्छी जानकारी के लिए +1। – WolfmanDragon

+0

तब MyView जहां 1 = 0 क्या करना चाहिए से * चुनें। हालांकि रुपये के साथ काम करना लेकिन यह बहुत तेज़ है। – OscarRyz

1

नहीं, वास्तव में कोई बेहतर तरीका नहीं है। आप समस्या पर फिर से देखना चाह सकते हैं। यदि आप समस्या को फिर से परिभाषित कर सकते हैं, तो कभी-कभी यह समाधान को सरल बनाता है क्योंकि समस्या बदल गई है।

0

चेतावनी: किसी भी समर्थन कागजी कार्रवाई :) बिना स्मृति से विशुद्ध रूप से टिप्पणी निम्नलिखित

तो मुझे याद है सही ढंग से एक रहस्यमय समस्या यह है कि इसकी कभी तो बदसूरत सिर का पोषण करता है जब ओरेकल कैश्ड rowset कार्यान्वयन कनेक्शन के साथ प्रयोग किया जाता है है पूलिंग। कैश किए गए रोसेट ऑब्जेक्ट में होने वाले कनेक्शन के लिए एक मूक संदर्भ प्रतीत होता है (भले ही इसे डिस्कनेक्ट किया जाना चाहिए) जो कचरा संग्रह पर पूल से बाद में खोला गया एक और कनेक्शन बंद कर देता है। इस कारण से मैंने अंततः अपना खुद का डेटा ऑब्जेक्ट लेयर छोड़ दिया और लिखा (इन दिनों मैं इसे वसंत & हाइबरनेट पर सौंप दूंगा)।

7

आप इस तथ्य का उपयोग करने का छोटा दृष्टिकोण ले सकते हैं कि कॉलम() कैलकुलेटर नाम में कॉलम नहीं है, तो कॉलम() अवैध SQL नाम के लिए एक SQLException फेंक देगा।

उदाहरण

try { 
    int foundColIndex = results.findColumn("nameOfColumn"); 
} catch { 
    // do whatever else makes sense 
} 

के लिए

संभावना हैंडलिंग अपवाद का दुरुपयोग (प्रति EffectiveJava 2 एड आइटम 57) लेकिन यह मेटा डेटा से सभी स्तंभों के माध्यम से पाशन के लिए एक विकल्प है।

+0

यह एक अच्छा विचार नहीं दिखता है। – Khatri

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

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