2011-02-07 13 views
6

पढ़ने की कोशिश कर रहा हूं मैं ओरेकल डेटाबेस से एक बीएलओबी पढ़ने की कोशिश कर रहा हूं। फ़ंक्शन GetFileContent एक पैरामीटर के रूप में p_file_id लेता है और एक BLOB लौटाता है। बीएलओबी एक डॉक्स-फाइल है जिसे किसी फ़ोल्डर में कहीं भी लिखा जाना चाहिए। लेकिन मैं बिल्कुल नहीं समझ सकता कि बीएलओबी कैसे पढ़ा जाए। वहाँ निश्चित रूप से कुछ return_value-परमाटर में संग्रहीत के बादब्लॉब

OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); 

है मूल्य है {बाइट [9946]}। लेकिन मैं जब

long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize); 

इसे कहते हैं InvalidOperationException पकड़ा गया था को क्रियान्वित करने में त्रुटि मिली: "। कोई डेटा पंक्ति या स्तंभ के लिए मौजूद है"

cmd = new OracleCommand("GetFileContent", oraCon); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("p_file_id", OracleType.Number).Direction = ParameterDirection.Input; 
cmd.Parameters[0].Value = fileID; 
cmd.Parameters.Add("return_value", OracleType.Blob).Direction = ParameterDirection.ReturnValue; 
cmd.Connection.Open(); 

OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); 
reader.Read(); 

MemoryStream memory = new MemoryStream(); 
long startIndex = 0; 
const int ChunkSize = 256; 
while (true) 
{ 
    byte[] buffer = new byte[ChunkSize]; 
    long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize); //FAILS 
    memory.Write(buffer, 0, (int)retrievedBytes); 
    startIndex += retrievedBytes; 
    if (retrievedBytes != ChunkSize) 
     break; 
} 
cmd.Connection.Close(); 
byte[] data = memory.ToArray(); 
memory.Dispose(); 

मैं समारोह से ब्लॉब कैसे पढ़ सकते हैं:

यहाँ कोड है?

+0

इसके बारे में काम कर रहे पूर्ण स्रोत कोड नमूने के साथ कोई अंतिम समाधान? – Kiquenet

उत्तर

2

ऐसा लगता है कि आप माइक्रोसॉफ्ट ओरेकल क्लाइंट का उपयोग कर रहे हैं। आप शायद GetBytes (...) का उपयोग करने के बजाय LOB ऑब्जेक्ट्स का उपयोग करना चाहते हैं।

मुझे लगता है कि नीचे दिया गया पहला लिंक आपके लिए सबसे आसान होगा। यहाँ एक अंश है:

using(reader) 
{ 
     //Obtain the first row of data. 
     reader.Read(); 
     //Obtain the LOBs (all 3 varieties). 
     OracleLob BLOB = reader.GetOracleLob(1); 
     ... 

     //Example - Reading binary data (in chunks). 
     byte[] buffer = new byte[100]; 
     while((actual = BLOB.Read(buffer, 0, buffer.Length)) >0) 
     Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual); 

     ... 
} 

OracleLob::Read Method

OracleLob Class

OracleDataReader::GetOracleLob Method

एक तरफ ध्यान दें पर, Microsoft Oracle ग्राहक मूल्यह्रास हुआ जा रहा है। आप ओरेकल के ओडीपी.net पर स्विच करने की सोच सकते हैं, क्योंकि यह एकमात्र "आधिकारिक रूप से समर्थित" क्लाइंट आगे बढ़ेगा।

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