Использование MemoryStream для сохранения файла .docx C # - PullRequest
6 голосов
/ 03 марта 2010

У меня возникли проблемы с загрузкой файла из Memory Stream в базу данных (он отображается в БД как 0x, так что я думаю, что он не сохраняется должным образом) Я не уверен, что это проблема с созданием Stream или сохранение в db from stream должно быть сделано иначе.

private void test {
        byte[] storage = new byte[500000];
        using (MemoryStream stream = new MemoryStream(storage))
        DocX documentWord = DocX.Create(stream);
        // some stuff
        documentWord.Save(); 
        databaseFilePut(stream);
}


public static void databaseFilePut(MemoryStream stream) {
        byte[] file;
        using (var reader = new BinaryReader(stream)) {
                file = reader.ReadBytes((int) stream.Length);
               // reader.Close();
        }
            //stream.Close();
        //}
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP))
        using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
            sqlWrite.ExecuteNonQuery();
        }
    }

Что я делаю не так? Я использую библиотеку кодекса Docx.

1 Ответ

7 голосов
/ 03 марта 2010

Вы пишете в поток, а затем сразу же пытаетесь прочитать с него без перемотки ... так что нет данных для чтения.

К счастью, в любом случае есть очень простой способ упростить код:

byte[] file = stream.ToArray();

Однако у вас есть еще одна потенциальная проблема:

byte[] storage = new byte[500000];
using (MemoryStream stream = new MemoryStream(storage))
...

Это позволит MemoryStream иметь фиксированный фиксированный размер 500K - не больше, не меньше. Я подозреваю, что это не то, что вы хотите; Я предлагаю вам избавиться от переменной storage и просто вызвать конструктор MemoryStream без параметров.

...