使用C#读取Oracle数据库Blob数据后保存文件无法打开的问题
解决Oracle Blob读取后PDF无法打开的问题
可能的原因及解决方案
1. 改用GetBytes直接读取Blob数据
你当前使用GetOracleBlob().Value的方式可能存在数据截断或编码问题,换成OracleDataReader.GetBytes直接读取是更可靠的方式:
using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); using (OracleCommand command = connection.CreateCommand()) { command.CommandText = "SELECT blobField FROM your_table WHERE your_condition"; using (OracleDataReader reader = command.ExecuteReader()) { if (reader.Read() && !reader.IsDBNull(reader.GetOrdinal("blobField"))) { // 获取Blob总大小 long blobTotalSize = reader.GetBytes(reader.GetOrdinal("blobField"), 0, null, 0, 0); byte[] buffer = new byte[blobTotalSize]; // 完整读取Blob数据 long bytesRead = reader.GetBytes(reader.GetOrdinal("blobField"), 0, buffer, 0, (int)blobTotalSize); // 确保读取的字节数和总大小一致 if (bytesRead == blobTotalSize) { File.WriteAllBytes("D:\\test1.pdf", buffer); } } } } }
2. 验证Blob数据源是否正常
先排除数据库中Blob本身损坏的可能:
- 使用PL/SQL Developer、Oracle SQL Developer等工具,直接导出目标Blob字段到本地文件
- 如果导出的文件依然无法打开,说明数据库中的原始数据已损坏,需要重新存入正确的文件
3. EF Core场景下的映射配置检查
如果用EF Core读取,确保实体类的Blob字段映射正确:
实体类定义
public class YourEntity { public int Id { get; set; } public byte[] BlobField { get; set; } }
DbContext配置
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<YourEntity>() .Property(e => e.BlobField) .HasColumnType("BLOB") // 明确指定Oracle的BLOB类型 .IsRequired(false); }
读取时直接保存即可:
var entity = await _dbContext.YourEntities.FirstOrDefaultAsync(e => e.Id == targetId); if (entity?.BlobField != null) { File.WriteAllBytes("D:\\test1.pdf", entity.BlobField); }
4. 校验字节数组完整性
对比数据库中Blob的大小和本地生成文件的大小:
- 在Oracle中执行
SELECT LENGTH(blobField) FROM your_table WHERE your_condition获取Blob长度 - 本地文件大小应与该数值完全一致,若不一致说明读取过程中存在截断
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

