2010-03-03 19 views
6

Ho qualche problema per caricare il file da Memory Stream al database (è visibile in DB come 0x, quindi suppongo che non venga salvato correttamente). Non sono sicuro che si tratti di un problema con lo streaming in fase di creazione o il salvataggio in db dal flusso dovrebbe essere fatto in modo diverso.Utilizzo di MemoryStream per salvare il file .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(); 
     } 
    } 

Cosa sto facendo di sbagliato? Sto usando la libreria codeplex di Docx.

risposta

7

Stai scrivendo nello stream e subito dopo provi a leggere da esso senza riavvolgere ... quindi non ci sono dati da leggere.

Fortunatamente, c'è un modo molto semplice di semplificare il codice in ogni caso:

byte[] file = stream.ToArray(); 

Tuttavia, hai un altro potenziale problema:

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

questo renderà il MemoryStream hanno un fissa Dimensione di 500K: niente di più, niente di meno. Sospetto che non sia quello che vuoi; Ti suggerisco di eliminare la variabile storage e di chiamare semplicemente il costruttore senza parametri MemoryStream.

+0

Grazie. Sapevo che mi mancava qualcosa :-) – MadBoy