C# 将文本文件作为BLOB存储在Oracle DB中会切断文件的结尾

C# 将文本文件作为BLOB存储在Oracle DB中会切断文件的结尾,c#,arrays,asp.net-mvc,oracle,entity-framework,C#,Arrays,Asp.net Mvc,Oracle,Entity Framework,我在一个过程中生成了一个文本文件,该文件在最后通过一个字符串列表循环发送给它,并通过MemoryStream和StreamWriter将该列表转换为byte[]。然后使用BLOB数据类型将字节[]保存到Oracle数据库中。虽然它适用于大多数数据(通常是数千行。我的数据在5000到40000之间,不管结果如何,结果都是一样的),但我有一条特定的消息在结尾,但它总是缺失。通常,文件中最后一行会被截断一半 生成字节[]的函数: public byte[] GenerateFileData() {

我在一个过程中生成了一个文本文件,该文件在最后通过一个字符串列表循环发送给它,并通过
MemoryStream
StreamWriter
将该列表转换为
byte[]
。然后使用
BLOB
数据类型将
字节[]
保存到Oracle数据库中。虽然它适用于大多数数据(通常是数千行。我的数据在5000到40000之间,不管结果如何,结果都是一样的),但我有一条特定的
消息在结尾,但它总是缺失。通常,文件中最后一行会被截断一半

生成
字节[]
的函数:

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;
}
字节[]
保存到数据库的函数:

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);
}

尝试在写入程序关闭后获取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()
。这对我来说非常有吸引力。我不认为您可以添加更多的细节来解释为什么这对将来查找它的任何人都有效?尝试像这样生成
byte[]
-->
System.Text.Encoding.Unicode.GetBytes(string.Join(Environment.NewLine,Messages))