2017-01-29 2 views
3

Ich versuche, ein Oracle BLOB-Feld zu lesen und zeigen Sie den Inhalt ich eine RichTextBox. Die Beispiele, die ich bei Google finde, sind fast gleich, aber ich kann es nicht zum Laufen bringen. Ich weiß, dass das BLOB-Feld serialisierte Daten enthält. Dies ist, was ich bisher: (der connecetion en Leser funktionieren)Lesen Oracle BLOB Feld

private void button1_Click_1(object sender, EventArgs e) 
     { 
      //testen of een blob is uit te lezen 


      OracleCommand cmd = new OracleCommand(); 
      cmd.Connection = OraConnection.conn; 

      cmd.CommandText = "select id, blobfield from test_table where id = '20ED7EDB-406A-43E8-945B-5E63DFCBA7FF'"; 
      cmd.CommandType = CommandType.Text; 

      OracleDataReader dr = cmd.ExecuteReader(); 

      dr.Read(); 
      OracleBlob BLOB1 = dr.GetOracleBlob(1); 

      Byte[] Buffer = (Byte[])(dr.GetOracleBlob(1)).Value; 

      string lookupValue = System.Text.ASCIIEncoding.ASCII.GetString(Buffer); 

      richTextBox1.Text += lookupValue; //shows: DQStream 
      richTextBox1.Text += ""; 
      richTextBox1.Text += "1"; 
      richTextBox1.Text += dr.GetOracleBlob(1).Value; //shows: System.Byte[] 
      richTextBox1.Text += ""; 
     } 
+0

Ich denke, Sie müssen dies zuerst tun: 'OracleBlob blob = (OracleBlob) dr.GetOracleBlob (1);' –

+0

Siehe nach de dr.read. Ich mache das schon. – Hansvb

+0

Sie scheinen 'Blob1' nicht zu verwenden. Ich habe gerade einen Beispielcode gepostet. –

Antwort

0

OracleBlob ein Stream - es erbt Stream.

OracleBlob b = dr.GetOracleBlob(1); 
var sr = new System.IO.StreamReader(b); 
var content = sr.ReadToEnd(); 

Sie sollten in der Lage sein, die Daten auf diese Weise zu erhalten.

Große Datenblöcke werden normalerweise als Stream geliefert.

Oracle Text & Tabellen: OracleBlob https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleBlobClass.htm

EDIT Wenn Sie es als byte[] werfen wollen, dann versuchen Sie dies:

Byte[] Buffer = (Byte[])(dr.GetOracleBlob(1)).Value; 
var content = new String(Encoding.UTF8.GetChars(Buffer)); 
+0

Es hat auch eine "Value" -Eigenschaft, die alle Daten als Byte-Array zurückgibt. Das ist nicht das Problem. Das Problem ist, dass das OP versucht, das Byte-Array einer String-Eigenschaft zuzuweisen –

+0

Ihr 'GetString'-Aufruf (der DQStream anzeigt) ist nicht richtig, denke ich. Versuchen Sie es mit 'UTF8' encoding –

+0

RTF ist kein einfacher Text. Es enthält Schriftgrößen, Namen usw. wie '{\ rtf1 \ ansi {\ fonttbl \ f0 \ fswiss Helvetica;} \ f0 \ pard'. Es scheint, dass das OP sowohl über BLOBs als auch RTF verwirrt ist. –

1

BLOB bedeutet "Binary Large Object" - es ist ein Byte-Array. Sie können es nicht direkt einer Zeichenfolge zuweisen oder anhängen. Wolltest du vielleicht einen CLOB verwenden?

Darüber hinaus ist RTF nicht serialisierte Daten oder Rohtext. Es enthält Schriftnamen, Codes usw., was bedeutet, dass Sie nicht einfach Text vorgeben und eine gültige RTF-Datei erhalten können. Ein RTF kann eingebettete OLE-Objekte enthalten, aber das ist heutzutage sehr selten.

Zum Beispiel ist das folgende Snippet ein gültiges RTF-Dokument. Wenn Sie dies an die Eigenschaft Text anhängen, werden alle Sonderzeichen angezeigt. Es ist nicht entweder Unicode, es ist nur alte ANSI:

{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard 
This is some {\b bold} text.\par 
} 

Unter der Annahme, dass der Feldtyp korrekt ist, und enthält tatsächlich ein RTF-Dokument, können Sie den Inhalt in die RTF laden die LoadFile(Stream, RichTextBoxStreamType) Methode. Ein OracleBlob ist ein Strom, was bedeutet, Sie schreiben:

var blob=dr.GetOracleBlob(1) 
richTextBox1.LoadFile(blob,RichTextBoxStreamType.RichText); 

Sobald Sie das Dokument laden können Sie es und prepend manipulieren, was Sie wollen.