我尝试读取Oracle BLOB字段并将内容显示为richTextBox。我在谷歌找到的例子几乎相同,但我仍然无法让它发挥作用。 我知道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 :(得分:3)
OracleBlob
是Stream
- 它继承了Stream
。
OracleBlob b = dr.GetOracleBlob(1);
var sr = new System.IO.StreamReader(b);
var content = sr.ReadToEnd();
您应该能够以这种方式获取数据。
大块数据通常作为流传递。
Oracle Docs: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));
答案 1 :(得分:1)
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);
加载文档后,您可以操作它并添加任何内容。