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

张开发
2026/4/20 1:03:42 15 分钟阅读

分享文章

如何通过C#读取Oracle数据库中的图片显示到WinForm_BLOB转Byte[]与流处理
Oracle BLOB字段读取必须用OracleCommand配合ExecuteScalar()或OracleDataAdapter获取OracleBlob对象再调用GetStream()获取流并完整读入byte[]不可直接强转须用Oracle.ManagedDataAccess连接字符串加Poolingfalse流操作需在连接关闭前完成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 并注意连接字符串里的 Poolingfalse.NET Framework 自带的 System.Data.OracleClient 早在 2011 年就标记为废弃VS 编译会警告运行时在新系统上大概率失败。现在唯一靠谱的是 Oracle 官方的 Oracle.ManagedDataAccess NuGet 包。关键细节 知网AI智能写作 知网AI智能写作写文档、写报告如此简单

更多文章