2010-03-03 5 views
6

У меня есть некоторые проблемы с загрузкой файла из потока памяти в базу данных (это видно в DB как 0x, поэтому я думаю, что он не сохраняется должным образом). Я не уверен, что проблема с созданием Stream или сохранением в db из потока должна выполняться по-другому.Использование MemoryStream для сохранения файла .docx C#

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 codeplex.

ответ

7

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

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

byte[] file = stream.ToArray(); 

Тем не менее, есть еще одна потенциальная проблема:

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

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

+0

спасибо. Я знал, что чего-то не хватает :-) – MadBoy