【问题标题】:Storing text file in Oracle DB as BLOB cuts off the end of the file将文本文件存储在 Oracle DB 中作为 BLOB 会切断文件的结尾
【发布时间】:2019-03-22 21:46:16
【问题描述】:

我在一个进程中生成一个文本文件,该文件最后循环通过输入给它的字符串列表,并通过MemoryStreamStreamWriter 将该列表转换为byte[]。然后使用BLOB 数据类型将byte[] 保存到Oracle 数据库中。虽然它适用于大多数数据(通常是数千行。我的数据在 5,000 到 40,000 之间,无论如何结果都是一样的),但我有一个特定的message,它在最后,但它总是丢失.通常,文件中的最后一行会被中途截断。

生成byte[]的函数:

public byte[] GenerateFileData()
{
    var fileData = new byte[0];

    using (var ms = new MemoryStream())
    {
        using (var sw = new StreamWriter(ms))
        {
            Messages.ForEach(x => sw.WriteLine(x)); // Messages is a list of strings in this class
            fileData = ms.ToArray();
        }
    }

    return fileData;
}

byte[]保存到数据库的函数:

public void SaveLogFile(int entityId, byte[] fileData)
{
    using (var context = new SomeDBContext())
    {
        var entity= context.SomeEntity.FirstOrDefault(x => x.Id == runId);
        if(entity != null)
        {
            entity.LOG_FILE = fileData;
            context.SaveChanges();
        }
    }
}

最后,将数据转换为文件的函数:

[HttpGet]
public FileResult GetLogFile(int id = 0)
{
    var fileData = new byte[0];

    using (var context = new SomeDbContext())
    {
        var entity = context.SomeEntity.FirstOrDefault(x => x.Id == id);
        fileData = entity.LOG_FILE;
    }

    var fileName = "SomethingSomething" + id.ToString();

    return File(fileData, "text/plain", fileName);
}

【问题讨论】:

  • 尝试像这样生成byte[] --> System.Text.Encoding.Unicode.GetBytes(string.Join(Environment.NewLine, Messages));

标签: c# arrays asp.net-mvc oracle entity-framework


【解决方案1】:

编写器关闭后尝试获取 MemoryStream 内容,如下代码:

public byte[] GenerateFileData()
{
    var fileData = new byte[0];

    using (var ms = new MemoryStream())
    {
        using (var sw = new StreamWriter(ms))
        {
            Messages.ForEach(x => sw.WriteLine(x)); // Messages is a list of strings in this class
        }
        ms.Flush();
        fileData = ms.ToArray();
    }

    return fileData;
}

【讨论】:

  • sw被释放时,它会刷新sw,然后刷新它的底层流(ms),所以不需要在使用块之后显式调用ms.Flush()。跨度>
  • 这对我来说就像一个魅力。我不认为您可以添加更多细节来说明为什么这对将来查找此内容的任何人都有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2020-01-03
  • 2010-10-09
相关资源
最近更新 更多