使用 C# 从 Oracle 中检索 Base64 数据到 JSON
Retrieving Base64 data from Oracle using C# into JSON
我编写了一个 ASP.NET Web 服务,它接受请求,从 Oracle 数据库收集数据并通过 JSON 发回信息。数据包括需要在 Base64 中 returned 的图像文件 (jpg)。
一切顺利,直到我尝试 return 图像。我的代码如下:
Oracle 存储过程:(转述)
create or replace PROCEDURE check_data(
<in parameters here>,
outpixblob OUT BLOB);
fileptr := utl_file.fopen('PIX_DIR', vFilename, 'rb', 32760);
utl_file.get_raw(fileptr, outpixblob);
这似乎运作良好,因为我已经对其进行了追踪并看到了可预测的数据returned(base64 字符串)
现在,C# 代码:
conn.Open();
var cmd = new OracleCommand
{
Connection = conn,
CommandText = "CHECK_DATA",
CommandType = CommandType.StoredProcedure,
};
//lots of parameter settings here, just showing the pertinent one
//cmd.Parameters.Add("outpixblob", OracleDbType.Blob).Direction = ParameterDirection.Output;
var dr = cmd.ExecuteNonQuery();
var blob = (OracleBlob) cmd.Parameters["outpixblob"].Value;
var buffer = new byte[blob.Length];
blob.BeginChunkWrite();
blob.Write(buffer, 0, (int)blob.Length);
blob.EndChunkWrite();
string photoString = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);
result = new VisitorCheckResult
{
...
Photo = photoString,
};
我显然又删掉了不必要的代码,但我相信我正在做的事情的想法就在那里。
photostring的结果不是我调试Oracle sproc时看到的值;相反,它是一长串'\u0000' 一遍又一遍。
我确定我遗漏了一些明显的东西,但作为一个 n00b,我无法看到它是什么。
求助!
好的,找到答案了。原来我在使用 write() 方法时错误地认为它会写入缓冲区。 Write() 方法将数据写入 Oracle BLOB 对象。我需要改为使用 Read() 方法。
发生这种情况后,我将 byte[] 数组转换为 base64:
result.Photo = Convert.ToBase64String(buffer);
结果很漂亮。
感谢所有人,尤其感谢 dbc,他们的回复帮助我了解了发生的事情。
我编写了一个 ASP.NET Web 服务,它接受请求,从 Oracle 数据库收集数据并通过 JSON 发回信息。数据包括需要在 Base64 中 returned 的图像文件 (jpg)。
一切顺利,直到我尝试 return 图像。我的代码如下:
Oracle 存储过程:(转述)
create or replace PROCEDURE check_data(
<in parameters here>,
outpixblob OUT BLOB);
fileptr := utl_file.fopen('PIX_DIR', vFilename, 'rb', 32760);
utl_file.get_raw(fileptr, outpixblob);
这似乎运作良好,因为我已经对其进行了追踪并看到了可预测的数据returned(base64 字符串)
现在,C# 代码:
conn.Open();
var cmd = new OracleCommand
{
Connection = conn,
CommandText = "CHECK_DATA",
CommandType = CommandType.StoredProcedure,
};
//lots of parameter settings here, just showing the pertinent one
//cmd.Parameters.Add("outpixblob", OracleDbType.Blob).Direction = ParameterDirection.Output;
var dr = cmd.ExecuteNonQuery();
var blob = (OracleBlob) cmd.Parameters["outpixblob"].Value;
var buffer = new byte[blob.Length];
blob.BeginChunkWrite();
blob.Write(buffer, 0, (int)blob.Length);
blob.EndChunkWrite();
string photoString = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);
result = new VisitorCheckResult
{
...
Photo = photoString,
};
我显然又删掉了不必要的代码,但我相信我正在做的事情的想法就在那里。
photostring的结果不是我调试Oracle sproc时看到的值;相反,它是一长串'\u0000' 一遍又一遍。
我确定我遗漏了一些明显的东西,但作为一个 n00b,我无法看到它是什么。
求助!
好的,找到答案了。原来我在使用 write() 方法时错误地认为它会写入缓冲区。 Write() 方法将数据写入 Oracle BLOB 对象。我需要改为使用 Read() 方法。
发生这种情况后,我将 byte[] 数组转换为 base64:
result.Photo = Convert.ToBase64String(buffer);
结果很漂亮。
感谢所有人,尤其感谢 dbc,他们的回复帮助我了解了发生的事情。