2010-09-28 23 views
6

सबसे पहले, मैं कहना चाहता हूं कि मैं यहां गहरे पानी पर हूं, क्योंकि मैं कंपनी में किसी अन्य व्यक्ति द्वारा लिखे गए कोड में कुछ बदलाव कर रहा हूं, एक्सेल में "बात" करने के लिए OleDbDataAdapter का उपयोग करके और मैं इससे परिचित नहीं हूं। वहां एक बग है जिसका मैं पालन नहीं कर सकता।एक्सेल शीट से डेटा लाने के लिए OleDbDataAdapter का उपयोग करने में समस्या

मैं 450 लाइनों के साथ एक्सेल फ़ाइल में पढ़ने के लिए ओलेडीबीडेटा एडाप्टर का उपयोग करने की कोशिश कर रहा हूं।

कोड में यह इस तरह किया जाता है:

connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + path + "';" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\""); 
connection.Open(); 
OleDbDataAdapter objAdapter = new OleDbDataAdapter(objCommand.CommandText, connection); 
objAdapter.Fill(objDataSet, "Excel"); 

foreach (DataColumn dataColumn in objTable.Columns) { 
    if (dataColumn.Ordinal > objDataSet.Tables[0].Columns.Count - 1) { 
    objDataSet.Tables[0].Columns.Add(); 
    } 
    objDataSet.Tables[0].Columns[dataColumn.Ordinal].ColumnName = dataColumn.ColumnName; 
    objImport.Columns.Add(dataColumn.ColumnName); 
} 

foreach (DataRow dataRow in objDataSet.Tables[0].Rows) { 
    ... 
} 

सब कुछ एक बात के अलावा ठीक काम कर रहा है। दूसरा कॉलम 6739, 3 9 20 और अधिकतर चार अंकों की संख्या से भरा हुआ है, लेकिन चूहे की पंक्तियों में अल्फान्यूमेरिक मान हैं जैसे 8201NO और 8205NO। उन पांच कोशिकाओं को उनकी अल्फान्यूमेरिक सामग्री के बजाय खाली सामग्री के रूप में रिपोर्ट किया जाता है। मैंने एक्सेल में चेक किया है, और इस कॉलम की सभी कोशिकाओं को टेक्स्ट के रूप में चिह्नित किया गया है।

यह एक xls फ़ाइल है, और xlsx नहीं।

क्या किसी के पास कोई सुराग है क्योंकि इन कोशिकाओं को डेटारो में खाली क्यों दिखाया गया है, लेकिन संख्यात्मक लोगों को ठीक दिखाया गया है? अल्फान्यूमेरिक सामग्री वाले अन्य कॉलम हैं जो ठीक दिखाए जाते हैं।

+0

सभी को धन्यवाद:

आप इस खुला स्रोत समाधान की कोशिश हो सकती है। आपने मुझे समझ लिया कि ऐसा क्यों हुआ, इसलिए मुझे उचित समाधान मिल सकता था। मुझे अभी भी लगता है कि यह जिस तरह से काम करता है वह बहुत भयानक है, लेकिन यह एक और कहानी है :) –

उत्तर

8

क्या हो रहा है कि एक्सेल उस कॉलम में पहले कई मानों के आधार पर स्प्रेडशीट कॉलम में डेटा प्रकार असाइन करने का प्रयास कर रहा है। मुझे संदेह है कि यदि आप उस कॉलम में गुणों को देखते हैं तो यह कहेंगे कि यह एक संख्यात्मक स्तंभ है।

समस्या तब होती है जब आप जेट का उपयोग करके उस स्प्रेडशीट से पूछने की कोशिश करना शुरू करते हैं। जब ऐसा लगता है कि यह एक संख्यात्मक कॉलम से निपट रहा है और यह एक वर्चर मूल्य पाता है तो यह चुपचाप कुछ भी नहीं देता है। यहां से जाने के लिए एक गुप्त त्रुटि संदेश भी नहीं है।

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

this article पर एक नज़र डालें। यह इस मुद्दे पर अधिक जानकारी देता है। यह भी एक संभव काम जो चारों ओर है के बारे में बात:

हालांकि, जेट प्रलेखन के अनुसार, हम , रजिस्ट्री के माध्यम से कनेक्शन स्ट्रिंग सेटिंग को ओवरराइड कर सकते हैं अगर हम सेट इ एक्स = 1 (विस्तारित के हिस्से के रूप गुण), जेट यूनिकोड VARCHAR या ADVARWCHAR पर ध्यान दिए बिना के रूप में सभी स्तंभ प्रकार सेट हो जाएगा 'ImportMixedTypes' कुंजी value.hey

+0

मैंने अभी इसका परीक्षण किया है, और वास्तव में अगर मैंने पहली पंक्ति अल्फान्यूमेरिक डाली है, तो यह अपेक्षा के अनुसार काम करता है। मेरी समस्या यह है कि मैं इसे एक सामान्य नियम नहीं बना सकता, क्योंकि ग्राहक अपनी चादरों में पढ़ेंगे। हालांकि, मेरा समाधान "धोखा" था, ताकि मैं यह सुनिश्चित करने के लिए कनेक्शन स्ट्रिंग में एचडीआर = नहीं बदलूं कि अल्फान्यूमेरिक हेडर कॉलम अल्फान्यूमेरिक बनाने के लिए पढ़ा जाता है, फिर मैंने परिणामी डेटाटेबल की पहली पंक्ति काट दिया। यह काफी बुरा है, लेकिन मुझे यहां कोई अन्य विकल्प नहीं दिख रहा है। मुझे सही दिशा में लाने में आपकी मदद के लिए बहुत बहुत धन्यवाद। –

+0

बहुत चुस्त। अगर यह काम करता है यह काम करता है! –

1

IMEX=1 का अर्थ है "पाठ के रूप में मिश्रित डेटा पढ़ें।"

हालांकि कुछ गॉथैस हैं। जेट केवल यह निर्धारित करने के लिए कई पंक्तियों का उपयोग करेगा कि डेटा मिश्रित है या नहीं, और यदि ऐसा होता है तो ये पंक्तियां सभी संख्यात्मक हैं, आपको यह व्यवहार मिल जाएगा। बाहर

चेक [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] स्थित रजिस्ट्री REG_DWORD "TypeGuessRows":

जानकारी के लिए connectionstrings.com देखें। कॉलम डेटा प्रकार का अनुमान लगाने के लिए एक्सेल को केवल पहली 8 पंक्तियों का उपयोग करने की अनुमति नहीं है। सभी पंक्तियों को स्कैन करने के लिए इस मान को 0 पर सेट करें। यह प्रदर्शन को चोट पहुंचा सकता है।कृपया यह भी ध्यान दें कि IMEX = 1 विकल्प जोड़ने से IMEX सुविधा केवल 8 पंक्तियों के बाद सेट हो सकती है। रजिस्ट्री TypeGuessRows = 0 (सभी पंक्तियों को स्कैन करें) को काम करने के लिए मजबूर करने के लिए IMEX = 0 का उपयोग करें।

+0

मुझे नहीं पता कि जेट को एक्सेल में कैसे उजागर किया गया है, लेकिन एक्सेस में, आप रजिस्ट्री को बदलने और एक्सेस को पुनरारंभ किए बिना जेट डीबी इंजन के अपने वर्तमान उदाहरण में रनटाइम पर चीजों को बदल सकते हैं। –

+0

इस जानकारी के लिए धन्यवाद। यह काम करता था लेकिन आश्चर्यजनक रूप से धीमा था, इसलिए मुझे इसके बजाय "हेडर पढ़ने और निपटाने" चाल के साथ जाना पड़ा। –

1

मैं एक्सेल तक पहुंचने के लिए ओलेडीबी डेटा प्रदाता सामग्री का उपयोग करने के खिलाफ सलाह दूंगा यदि आप इसकी मदद कर सकते हैं। मेरे पास कुछ भी समस्याएं नहीं हैं, क्योंकि कारणों ने दूसरों के बारे में बताया है। जब आप बड़े स्प्रेडशीट से निपट रहे हों तो प्रदर्शन भी अत्याचारी होता है। मुझे इस मुद्दे के साथ बाहर की मदद करने के लिए http://exceldatareader.codeplex.com/

+0

मैं पूरी तरह से आपके साथ मार्क से सहमत हूं। मुझे लगता है कि यह काफी भयानक है, लेकिन इस मामले में मेरे पास कोई विकल्प नहीं है क्योंकि मुझे किसी मौजूदा प्रोग्राम में इस बग को ठीक करने के लिए असाइन किया गया है, और किसी भी बड़े रिफैक्टरिंग करने के लिए समय आवंटित नहीं किया गया है। अगर मैं बाद में स्क्रैच से ऐसा करने की ज़रूरत है तो मैं आपके लिंक को दिमाग में रखूंगा। –