我试着去阅读一个Oracle BLOB字段和展示的内容我一个RichTextBox。我与谷歌找到的例子几乎是相同的,但我仍然不能得到它的工作。我知道BLOB字段包含序列化的数据。这是我到目前为止有:(该connecetion EN读者做工精细)
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 += "";
}
OracleBlob
是Stream
- 它继承Stream
。
OracleBlob b = dr.GetOracleBlob(1);
var sr = new System.IO.StreamReader(b);
var content = sr.ReadToEnd();
你应该能够获取数据这种方式。
大数据块典型地递送作为流。
甲骨文文档:OracleBlob https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleBlobClass.htm
编辑如果你想将它转换为byte[]
,那就试试这个:
Byte[] Buffer = (Byte[])(dr.GetOracleBlob(1)).Value;
var content = new String(Encoding.UTF8.GetChars(Buffer));
BLOB的意思是“二进制大对象” - 这是一个字节数组。你不能直接分配到一个字符串或追加它。您的意思是也许使用CLOB?
此外,RTF不是序列化的数据或原始文本。它包含的字体名称,代码等,这意味着你不能只是前面加上文本,并得到有效的RTF文件。一个RTF可能包含嵌入OLE对象,但是这是非常罕见的,这些天。
例如,下面的片段是一个有效的RTF文档。这追加的Text
属性将显示所有的特殊字符。它不是Unicode要么,这是普通的旧ANSI:
{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard
This is some {\b bold} text.\par
}
假设该字段类型是正确的,实际上包含RTF文档,可以将其内容装入使用LoadFile(Stream, RichTextBoxStreamType)方法RTF。一个OracleBlob是甲流,这意味着你可以这样写:
var blob=dr.GetOracleBlob(1)
richTextBox1.LoadFile(blob,RichTextBoxStreamType.RichText);
一旦加载文档,你可以操纵它与前面加上任何你想要的。