2010-01-26 8 views
6

मेरे पास एक्सेस .mdb फ़ाइल में सरल डेटाबेस है, लेकिन मुझे नहीं पता कि "पैरामीटर मान्य नहीं है" अपवाद जब मैं स्ट्रीम से Image बना रहा हूं। मैंने पढ़ा है कि मुझे 78 बाइट ऑफसेट (from here) को पट्टी करने की आवश्यकता है, लेकिन मैं अभी भी को "पैरामीटर मान्य नहीं है" त्रुटि प्राप्त करें जब मैं पहली बार बाइट्स को अलग करने के बाद भी सेस्ट्रीम को कॉल करता हूं।एक्सेस से छवि पढ़ना - पैरामीटर वैध नहीं है


यह मेरे लिए काम नहीं करता:

byte[] abytPic = (byte[])dt.Rows[0]["Photo"]; byte arrary with image 
if ((abytPic[0] == 21) && (abytPic[1] == 28)) //It's true 
{ 
    byte[] abytStripped = new byte[abytPic.Length - 78]; 
    System.Buffer.BlockCopy(abytPic, 78, abytStripped, 0, abytPic.Length - 78); 
    msPic = new emoryStream(abytStripped); 
} 
+0

जब आप एमएस एक्सेस तालिका है कि आपके छवि कॉलम होता है देखने के लिए, क्या पाठ आप क्षेत्र में देखते हैं? क्या यह 'लांग बाइनरी डेटा' या कुछ अलग है? – Stewbob

उत्तर

6

आप एमएस एक्सेस से सीधे डेटा पढ़ रहे हैं, तो आप किसी भी हेडर सूचना पट्टी की जरूरत नहीं है।

छवि मान लिया जाये कि एक BLOB, जो सबसे आम है के रूप में संग्रहीत किया जाता है, यहाँ डेटाबेस और एक छवि फ़ाइल के रूप में की दुकान (क्षमा करें, बजाय सी # के वीबी) से बाइट्स की सरणी में पढ़ने के लिए कोड है:

Dim varBytes() As Byte 

    Using cn As New OleDbConnection(myConnectionString) 
    cn.Open() 

    sqlText = "SELECT [myColumn] " _ 
       & "FROM [myTable] " _ 
       & "WHERE ([mySearchCriteria] = '" & mySearchTerm & "')" 

    Using cm As New OleDbCommand(sqlText, cn) 
     Dim rdr As OleDbDataReader 

     rdr = cm.ExecuteReader 

     rdr.Read() 

     varBytes = rdr.GetValue(0) 
    End Using 

    End Using 

    My.Computer.FileSystem.WriteAllBytes(myPath & "\myFile.emf", varBytes, True) 

यह उदाहरण है कि मैंने चारों ओर बिछाया था, जहां मुझे पता था कि डेटाबेस में फ़ाइलों को .emf छवियां थीं। यदि आप एक्सटेंशन जानते हैं, तो आप इसे फ़ाइल नाम पर डाल सकते हैं। यदि आप नहीं करते हैं, तो आप इसे खाली छोड़ सकते हैं और फिर परिणामस्वरूप एक दर्शक दर्शक के साथ खोल सकते हैं; इसे शुरू करना चाहिए। यदि आपको एक्सटेंशन या फ़ाइल प्रकार खोजने की आवश्यकता है, तो इसे फ़ाइल के रूप में सहेजने के बाद, आप इसे किसी भी हेक्स संपादक के साथ खोल सकते हैं और फ़ाइल प्रकार हेडर जानकारी से उपलब्ध होगा।

आपका प्रश्न थोड़ा अस्पष्ट है, इसलिए मुझे यकीन नहीं है कि उपर्युक्त कोड बिल्कुल वही है जो आप चाहते हैं, लेकिन यह आपको बहुत करीब ले जाना चाहिए।

संपादित करें:

यह VB कोड है कि एक MemoryStream वस्तु में बाइट्स की सरणी लेता है, भार यह, और फिर स्ट्रीम से एक छवि वस्तु बनाता है। कोड का यह बिट बस ठीक काम करता था, और मेरे फॉर्म पर एक चित्र बॉक्स में छवि प्रदर्शित करता था।

Dim img As Image 
    Dim str As New MemoryStream(varBytes) 
    img = Image.FromStream(str) 
    PictureBox1.Image = img 

इस के सी # बराबर आप के लिए काम नहीं कर रहा है, तो समस्या कैसे छवि एमएस एक्सेस डेटाबेस में संग्रहीत किया जाता है में होने की संभावना है।

संपादित करें:

अपने डेटाबेस में छवि एक 'पैकेज' है न कि 'लांग बाइनरी डेटा' के रूप में संग्रहीत किया जाता है, तो आप शीर्ष लेख जानकारी है कि एमएस एक्सेस कहते पट्टी की जरूरत होगी। मैं एक सरल .jpg फ़ाइल के साथ 'पैकेज' छवि भंडारण प्रकार के साथ खेल रहा हूं। इस मामले में हेडर 78 बाइट्स से काफी लंबा है। इस उदाहरण में, यह वास्तव में 234 बाइट्स है, और एमएस एक्सेस ने मूल फ़ाइल के अंत में कुछ जानकारी भी जोड़ दी है; इस मामले में लगभग 2 9 2 बाइट्स।

ऐसा लगता है कि आपका मूल दृष्टिकोण सही था, आपको बस यह निर्धारित करने की आवश्यकता होगी कि कितनी बाइट्स आपकी स्थिति के लिए बाइट सरणी के आगे और पीछे की ओर पट्टी कर सकती हैं।

मैंने मूल छवि फ़ाइल की तुलना करके, और एक हेक्स संपादक में डेटाबेस से निर्यात की गई फ़ाइल (स्ट्रीम ऑब्जेक्ट पर नहीं, मेरा पहला कोड देखें) की तुलना करके इसे अपनी फ़ाइल के लिए निर्धारित किया। एक बार जब मुझे पता चला कि एमएस एक्सेस द्वारा कितनी जानकारी (हेडर और पाद लेख) जोड़ा गया था, तो मुझे पता था कि कितने बाइट को छीनने की आवश्यकता है।

संपादित करें:

हैडर एमएस एक्सेस से जोड़ा जब छवि के रूप में 'पैकेज' शब्द हटाएं फ़ाइल प्रकार के आधार पर, और छवि जब के मूल स्थान (पूरा पथ जानकारी) संग्रहीत किया जाता है के आकार इसे एमएस एक्सेस डेटाबेस में डाला गया था। तो, यहां तक ​​कि एक ही फ़ाइल प्रकार के लिए, आपके पास प्रत्येक फ़ाइल के लिए शीर्षलेख से स्ट्रिप करने के लिए बाइट्स की एक अलग संख्या हो सकती है। इससे यह बहुत कठिन हो जाता है, क्योंकि तब तक आपको बाइट सरणी स्कैन करना होगा जब तक आपको उस फ़ाइल प्रकार के लिए सामान्य स्टार्ट-ऑफ-फ़ाइल जानकारी नहीं मिलती, और फिर इससे पहले सब कुछ पट्टी करें।

यह सभी सिरदर्द एक कारण है कि छवियों को डेटाबेस में बीएलओबी 'लांग बाइनरी डेटा' के रूप में स्टोर करना बेहतर होता है। पुनर्प्राप्ति बहुत आसान है। मुझे नहीं पता कि आपके पास ऐसा करने का विकल्प है, लेकिन यदि ऐसा है, तो यह एक अच्छा विचार होगा।

+0

लेकिन जब मैं निर्माता छवि के ऑब्जेक्ट को तुरंत चालू करने का प्रयास कर रहा हूं, बाइट सरणी (आपके उदाहरण में varBytes) को कन्स्ट्रक्टर पैरामीटर के रूप में पास कर रहा हूं, मुझे त्रुटि मिल रही है: पैरामीटर मान्य नहीं है। यह एक वैध बाइट सरणी है (लंबाई के बारे में 3000 बाइट्स - छवि आकार के आधार पर)। – Dariusz

+0

धन्यवाद ऐसा लगता है कि ओलेऑब्जेक्ट हेडर की लंबाई प्राप्त करने के लिए कोई भी समाधान नहीं है। आपके समर्थन के लिए धन्यवाद। – Dariusz

1

मुझे विश्वास नहीं है कि आपकी समस्या डेटाबेस के साथ है। "पैरामीटर वैध नहीं है" इमेजिंग से निपटने के दौरान अपवाद कुल दर्द हो सकता है जैसा कि मैंने पहले उनके साथ निपटाया है। वे समस्या के बारे में बहुत स्पष्ट नहीं हैं।

छवि को डेटाबेस में कैसे रखा गया था? इससे पहले कि आपने इसे खींचने का प्रयास किया हो, डेटाबेस में छवि को लिखने में समस्या हो सकती है। साथ ही, छवि का कौन सा फ़ाइल प्रकार है?

संपादित करें यहां कुछ नमूना कोड है जिसका उपयोग मैंने बाइट सरणी से छवि प्राप्त करने से पहले किया है।

 //takes an array of bytes and converts them to an image. 
    private Image getImageFromBytes(byte[] myByteArray) 
    {    
     System.IO.MemoryStream newImageStream = new System.IO.MemoryStream(myByteArray, 0, myByteArray.Length); 
     return Image.FromStream(newImageStream, true); 
    } 
+0

नोट: यह सब मानते हैं कि आप अपने डेटाबेस कॉल से वैध मान वापस प्राप्त कर रहे हैं। – Aaron

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