Dortimer
Dortimer

Reputation: 617

Storing text file in Oracle DB as BLOB cuts off the end of the file

I'm generating a text file in a process which at the end loops through a list of strings that were fed to it, and through a MemoryStream and StreamWriter it converts that list to byte[]. The byte[] is then saved to an Oracle Database using a BLOB datatype. While it works for the majority of the data (typically thousands of lines. I've had anywhere between 5,000 and 40,000, and it's the same result regardless), I have a specific message that goes at the end, but it's always missing. Generally the last line that does end up in the file is cut off halfway.

The function that generates the 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;
}

The function that saves the byte[] to the database:

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

And lastly, the function that turns the data into a file:

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

Upvotes: 1

Views: 316

Answers (1)

bdn02
bdn02

Reputation: 1500

Try to get the MemoryStream content after the writer close asthis code:

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

Upvotes: 2

Related Questions