2017-01-29 46 views
3

Oracle BLOBフィールドを読み込み、コンテンツiをrichTextBoxに表示しようとしました。私がGoogleで見つけた例はほとんど同じですが、それでも私はそれを働かせることはできません。 BLOBフィールドにはシリアル化されたデータが含まれています。 これは私がこれまで持っているものです。 (リーダー作業罰金エンconnecetion)Oracle BLOBフィールドを読み取る

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

私はこれを最初に行う必要があると思います: 'OracleBlob blob =(OracleBlob)dr.GetOracleBlob(1);' –

+0

dr.readの後を参照してください。私はすでにそれをやっています。 – Hansvb

+0

あなたは 'Blob1'を使用していないようです。私はサンプルコードをいくつか投稿しました。 –

答えて

0

OracleBlobStreamある - それはStreamを継承します。

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

このようにデータを取得できるはずです。

通常、大きなデータブロックはストリームとして配信されます。

Oracleのドキュメント:あなたはbyte[]としてそれをキャストする場合のOracleBlob https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleBlobClass.htm

EDIT 、これを試してみてください。

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

また、すべてのデータをバイト配列として返す 'Value'プロパティもあります。それは問題ではありません。問題は、OPが文字列プロパティにバイト配列を割り当てようとしていることです。 –

+0

'GetString'コール(DQStreamを表示)が正しくないと思います。 'UTF8'エンコーディングを試してください –

+0

RTFはプレーンテキストではありません。 '{\ rtf1 \ ansi {\ fonttbl \ f0 \ fswiss Helvetica;} \ f0 \ pard'のようなフォントサイズや名前などが入っています。 OPはBLOBとRTFの両方について混乱しているようです。 –

1

BLOBを意味し、 "バイナリラージオブジェクト" - それはバイト配列です。文字列に直接割り当てることも、追加することもできません。おそらくCLOBを使用することを意味しましたか?

さらに、RTFはシリアル化されたデータまたは生のテキストではありません。フォント名、コードなどが含まれています。つまり、テキストを追加して有効なRTFファイルを取得することはできません。 RTFには埋め込みOLEオブジェクトが含まれていることがありますが、これは最近では稀です。

たとえば、次のスニペットは有効なRTFドキュメントです。これをTextプロパティに追加すると、すべての特殊文字が表示されます。それは、昔ながらのANSIですが、どちらかのUnicodeではありません。

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

フィールドタイプが正しいこと、そして実際にRTFドキュメントが含まれていると仮定すると、あなたがLoadFile(Stream, RichTextBoxStreamType)メソッドを使用してRTFにその内容を読み込むことができます。

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

をあなたが好きなあなたはそれを操作することができ、文書やプリペンドをロードしたら:OracleBlobのは、あなたが書くことができることを意味、ストリームです。

関連する問題