如何通过C#读取Oracle数据库中的图片显示到WinForm_BLOB转Byte[]与流处理

Oracle BLOB字段读取必须用OracleCommand配合ExecuteScalar()或OracleDataAdapter获取OracleBlob对象,再调用GetStream()获取流并完整读入byte\[\],不可直接强转;须用Oracle.ManagedDataAccess,连接字符串加Pooling=false,流操作需在连接关闭前完成,UI更新须Invoke回主线程。Oracle BLOB 字段读取必须用 OracleCommand 配合 ExecuteScalar() 或 OracleDataAdapter,不能直接当字符串查oracle 的 blob 是二进制大对象,sql 查询里如果写 select photo from users 拿到的不是字节数组,而是一个 oracleblob 对象(或 dbnull),直接强转 byte\[\] 会崩------常见错误是 invalidcastexception 或空引用。正确做法是显式获取流或分块读取:用 ExecuteScalar() 获取 OracleBlob 实例,再调用其 GetStream() 方法若用 OracleDataAdapter.Fill() 填充 DataTable,字段值类型是 OracleBlob,仍需调用 GetStream(),不能直接 (byte\[\])row"photo"别用 CommandBehavior.SequentialAccess 以外的方式读大 BLOB,否则可能内存爆掉WinForm 中显示图片前必须确保 byte\[\] 完整且格式可识别从 OracleBlob.GetStream() 读出来的流,得先全部读成 byte\[\] 才能喂给 PictureBox.Image。但注意:流位置可能不在开头,且 Oracle 驱动有时返回不可重置的流。实操建议:始终用 using (var stream = blob.GetStream()) { ... } 包裹,避免句柄泄漏用 stream.CopyTo(ms) 写入 MemoryStream,再调用 ms.ToArray() ------别用 stream.Read() 自己循环,容易漏字节检查 byte\[\] 开头是否为常见图片魔数(如 0xFF, 0xD8 表示 JPEG),防止数据库存了空/损坏数据导致 PictureBox 显示空白却不报错若图片尺寸大,考虑异步加载(Task.Run + Invoke 回 UI 线程),否则界面卡死OracleClient 已废弃,必须用 Oracle.ManagedDataAccess 并注意连接字符串里的 Pooling=false.NET Framework 自带的 System.Data.OracleClient 早在 2011 年就标记为废弃,VS 编译会警告,运行时在新系统上大概率失败。现在唯一靠谱的是 Oracle 官方的 Oracle.ManagedDataAccess NuGet 包。关键细节: 知网AI智能写作 知网AI智能写作,写文档、写报告如此简单

相关推荐
流星白龙19 小时前
【Redis】2.Redis重大版本
数据库·redis·junit
流星白龙19 小时前
【Redis】7.Hash表
数据库·redis·哈希算法
love530love19 小时前
OpenClaw Windows Companion 桌面客户端 连接 LM Studio 完整配置指南
人工智能·windows·python·openclaw
流星白龙20 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
王八八。21 小时前
Navicat 17破解版下载安装教程 附安装激活步骤(2026 最新版)
数据库·navicat
cui_ruicheng21 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena157795857921 天前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
_Jimmy_1 天前
FastAPI + SQLAlchemy全局事务管理
python·fastapi
用户8356290780511 天前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python
流星白龙1 天前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存