Хранение текстового файла в БД Oracle, поскольку BLOB обрезает конец файла - PullRequest
1 голос
/ 23 марта 2019

Я создаю текстовый файл в процессе, который в конце перебирает список строк, которые были ему переданы, а через MemoryStream и StreamWriter он преобразует этот список в byte[].byte[] затем сохраняется в базе данных Oracle с использованием типа данных BLOB.Хотя он работает для большинства данных (обычно это тысячи строк. У меня было от 5000 до 40000, и это одинаковый результат, независимо от), у меня есть конкретный 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);
}

1 Ответ

2 голосов
/ 23 марта 2019

Попробуйте получить содержимое 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...