Salvare / leggere file

giovedì 22 marzo 2018 - 11.47

marco.morgia Profilo | Junior Member

Ciao a tutti,

ho la necessità di scaricare un file (da un web service), leggerlo e salvarlo nel db. Poi all'occorrenza rileggere quanto salvato nel db e far visualizzare il file.

Il database che uso è Mysql, ed il tipo campo è un blob.

Quello che ho fatto è scaricare il file, leggerlo, salvarlo nel db come un array di Byte, e fin qui sembra che non ci sono problemi. Il problema ce l'ho nella riapertura del file, in quanto il file che creo (è un file csv) tramite

FileStream fileStream = new FileStream(pathSalvataggio, FileMode.Create);
fileStream.Write(arrBytes, 0, arrBytes.Length);
fileStream.Close();

mi crea correttamente il file, ma il contentuto non è quello del file originale.

Qualcuno potrebbe aiutarmi?

Grazie

Fantazma Profilo | Junior Member

Ciao, per aiutarti bisognerebbe vedere come carichi il file in arrBytes. Bisogna in pratica pian piano risalire la catena a ritroso fino ad arrivare al file originale.
Diamo assolutamente per certo che il file nel DB venga salvato correttamente?

marco.morgia Profilo | Junior Member

Ho utilizzato questo metodo

byte[] ReadFile(string sPath)
{
//Initialize byte array with a null value initially.
byte[] data = null;

//Use FileInfo object to get file size.
FileInfo fInfo = new FileInfo(sPath);
long numBytes = fInfo.Length;

//Open FileStream to read file
FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);

//Use BinaryReader to read file stream into byte array.
BinaryReader br = new BinaryReader(fStream);

//When you use BinaryReader, you need to supply number of bytes to read from file.
//In this case we want to read entire file. So supplying total number of bytes.
data = br.ReadBytes((int)numBytes);

//Close BinaryReader
br.Close();

//Close FileStream
fStream.Close();

return data;
}

Fantazma Profilo | Junior Member

Il metodo che hai postato è per la lettura dei dati da file. Ma ora è da verificare come fai la lettura dei dati dal DB se ho seguito la logica di funzionamento del tuo software.
Hai detto:
Scarico file -> Salvo file -> Leggo file -> Salvo contenuto file nel DB -> Leggo file dal DB...
Ora, nell'ultimo passo il file è diverso da quello che hai scaricato, quindi andrei a vedere se la lettura dal DB è corretta.. poi, se non ci sono problemi, si va a vedere cosa si salva nel DB... e così via.

marco.morgia Profilo | Junior Member

Allora per quanto riguarda la scrittura nel db gli passo direttamente quello che leggo in arrayByte,

per la lettura utilizzo invece utilizzo una dll esterna (invece del classico reader) che richiama questo metodo

public static T GetReaderValue<T>(this IDataRecord row, int ordinal)
{
//var value = row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal);
object value;
if (row.IsDBNull(ordinal))
{
if (typeof(T) == typeof(String))
value = "";
else
{
value = default(T);
}
}
else
value = row.GetValue(ordinal);

return (T)Convert.ChangeType(value, typeof(T));
}

mi sta venendo in mente che il problema possa essere questo.

Fantazma Profilo | Junior Member

E' molto probabile che il problema sia nella procedura di scrittura/lettura dei dati nel DB. Verifica bene questi due passaggi. Un consiglio: dato che scrivi manualmente i dati nel DB... leggi manualmente i dati dal DB, così sei padrone di tutto il processo. Per cose semplici in genere non mi piace usare componenti già pronti.

marco.morgia Profilo | Junior Member

Come posso scrivere un byte[] in un campo BLOB?

Quello che faccio al momento è convertirlo prima di inserirlo nel db

Convert.ToBase64String(........)

Fantazma Profilo | Junior Member

Ora non ho visual studio sotto mano, ma ti riporto un estratto dal primo risultato facendo una ricerca in google:

String textValue = "Some example of text..." oraCommand.CommandText = "UPDATE BLOB_TABLE SET BLOB_COLUMN = :data WHERE ID='123'"; OracleParameter param = oraCommand.Parameters.Add("data", OracleDbType.Blob); param.Value = Encoding.ASCII.GetBytes(textValue); oraCommand.ExecuteNonQuery();

Il codice è per Oracle, ma lo puoi facilmente adattare alle tue necessità.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5