You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:12:53