Oracle Long类型存储图片读取及ASPX页面展示:字符串转byte[]报错解决方案求助
解决Oracle LONG类型列读取图片转byte[]的问题
看起来你踩了一个典型的坑——把二进制的图片数据当成字符串来处理了!Oracle的LONG列在这里存的是原始二进制字节流,不是文本内容,所以用ToString()再通过编码转成byte[]的方式完全行不通,这就是你报错的原因。
下面是修正后的解决方案,我会一步步说明改动点:
核心错误分析
你原来的代码里:
byte[] blob_ = System.Text.UTF32Encoding.ASCII.GetBytes(TableReader[13].ToString());
这一步完全错误:LONG列里的图片是二进制(比如JPG的字节序列),不是ASCII/UTF32文本,强行转成字符串会破坏字节结构,再转回来的byte[]根本不是原来的图片数据。
正确的处理方式
OracleDataReader自带的GetBytes方法可以直接读取LONG列的二进制数据,加上你已经设置了command.InitialLONGFetchSize = -1(这个设置很重要,确保读取完整的LONG数据),只需要正确调用这个方法就行。
修正后的完整代码
OracleDataReader TableReader = null; string connectionString = ConfigurationManager.ConnectionStrings["System.Data.OracleClient"].ConnectionString; using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); // 建议用列名代替索引,避免列顺序变动导致错误 string sql = "Select * From IMAGE_TABLE where CUST_ID ='xxxxxxxx' fetch first 1 rows only"; using (OracleCommand command = new OracleCommand(sql, connection)) { command.InitialLONGFetchSize = -1; // 必须设置,确保读取完整的LONG数据 TableReader = command.ExecuteReader(); while (TableReader.Read()) { try { // 确认13是你的LONG类型图片列的索引,或者换成列名更安全,比如TableReader["IMAGE_COL"] int columnIndex = 13; // 先获取数据的总长度 long dataLength = TableReader.GetBytes(columnIndex, 0, null, 0, 0); byte[] imageBytes = new byte[dataLength]; // 读取所有字节到数组里 long bytesRead = TableReader.GetBytes(columnIndex, 0, imageBytes, 0, (int)dataLength); // 验证是否读取完整 if (bytesRead != dataLength) { throw new Exception("未能完整读取图片数据"); } // 方式1:保存到本地文件(测试用) //using (FileStream file = new FileStream("d:\\Img1.jpg", FileMode.Create, FileAccess.Write)) //{ // file.Write(imageBytes, 0, imageBytes.Length); //} // 方式2:转成Image对象用于ASPX页面展示 using (MemoryStream ms = new MemoryStream(imageBytes)) { image = Image.FromStream(ms); // 这里可以把image绑定到ASPX的Image控件,比如: // Image1.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(imageBytes); // 或者把byte[]存到Session里,再通过Handler输出 } } catch (Exception rr) { // 这里建议添加错误日志,方便排查问题 // 比如Log.Error("读取图片失败", rr); } finally { TableReader?.Close(); } } } }
额外注意事项
- 列索引的问题:尽量用列名(比如
TableReader["IMAGE_COLUMN"])代替数字索引,避免表结构变动导致索引错位。 - 图片格式验证:确保LONG列里存的是标准的图片字节流(比如JPG、PNG),如果是其他格式,
Image.FromStream可能会报错。 - ASPX展示优化:如果要在页面上展示,更高效的方式是写一个ASHX Handler,接收图片ID,从数据库读取byte[]后直接输出响应(设置正确的Content-Type),然后Image控件的Url指向这个Handler,这样比转成Image对象更节省资源。
内容的提问来源于stack exchange,提问作者SAS
相关产品推荐
相关产品推荐

