使用C#将Base64数据从Oracle检索到JSON中



我编写了一个ASP.NET web服务,它接受请求,从Oracle数据库收集数据,并通过JSON发回信息。该数据包括一个需要在Base64中返回的图像文件(jpg)。

一切都很顺利,直到我试图返回图像。我的代码如下:

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);

这似乎工作得很好,因为我已经追踪了它,并看到了可预测的数据返回(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存储过程时看到的值;相反,它是一个长字符串"\u0000",一次又一次。

我确信我明显遗漏了一些东西,但作为一个n00b,我看不出它是什么。

救命!

好的,找到了答案。事实证明,我使用write()方法时,错误地认为它会写入缓冲区。Write()方法将数据写入Oracle BLOB对象。我需要使用Read()方法。

一旦发生这种情况,在我将byte[]数组转换为base64:之后

result.Photo = Convert.ToBase64String(buffer);

结果很好。

感谢所有人,特别是感谢dbc,他的回应帮助我意识到发生了什么。

最新更新