Utilizzando MemoryStream per salvare .docx file C #
-
24-09-2019 - |
Domanda
Ho qualche difficoltà a caricare il file dalla memoria Stream per database (è visibile nel DB come 0x quindi credo che non viene salvato correttamente). Non sono sicuro che si tratti di un problema con il flusso in fase di creazione o salvare su db dal flusso dovrebbe essere fatto in modo diverso.
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();
}
}
Che cosa sto facendo di sbagliato? Sto usando Docx biblioteca CodePlex.
Soluzione
Stai scrivendo al torrente e poi subito cercando di leggere da esso senza riavvolgimento ... quindi non ci sono dati da leggere.
Per fortuna, 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 fisso dimensioni di 500K - né più, né meno. Ho il sospetto che non è ciò che si vuole; Vi suggerisco di sbarazzarsi della variabile storage
e basta chiamare il costruttore senza parametri MemoryStream
.