Estrarre file da Db in C#

lunedì 18 aprile 2011 - 14.40
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows 7  |  Visual Studio 2008  |  SQL Server 2005  |  MySQL 5.0

eddyG Profilo | Junior Member

Ciao a tutti!
il mio problema è dato dal fatto che vorrei estrarre il contenuto di file (qualsiasi estensione) salvato precendentemente su Db Mysql(tale file viene salvato in binario).
Esiste qualche metodo,qualche libreria...che mi permetta di fare questo passaggio?

Grazie

StefanoRicci Profilo | Junior Member

puoi spiegare meglio cosa intendi?

vuoi aprire il file che crea il DBMS in cui salva i valori dei record oppure vuoi estrarre il contenuto di un file che è stato inserito all'interno del record, come per esempio un immagine caricata all'interno del db?
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

esempio:
io creo un file di testo(txt),un file di excel,un file di word,un immagine.
So per certo che viene salvato in binario sul Db...io vorrei,tramite un button,aprire il file con il relativo programma.
TXT con Notepad...Xls con excel...Pdf con adobe...e così via.

StefanoRicci Profilo | Junior Member

quindi lo inserisci direttamente come valore nel record della tabella....

in questo caso per mysql ci sta la struttura che si chiama connector con le varie reference.... basta che usi una tabella che contenga anche il riferimento del nome del file oltre al file stesso...

tramite il nome conosci l'estensione, e quindi una volta che ti torna il file dalla query (e lo salvi con il nome giusto in una cartella temporanea), basta che fissi te che software usare per la particolare estensione, oppure puoi usare quelli configurati in windows, trovi nel registro del sistema il collegamento tra estensione ed eseguibile
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

L'istruzione di cui ho bisogno è la stessa che in Vb6 viene eseguita con il comando PUT seguito dai valori...ma in C# non riesco a trovarla

StefanoRicci Profilo | Junior Member

una volta che il file lo hai nominato nella maniera corretta e lo hai estratto dal database, puoi semplicemente usare una chiamata a processo esterno....

nell'esempio qui sotto chiamo explorer dicendogli di aprire la particolare cartella tramite parametro....

try { System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents = false; proc.StartInfo.FileName = "explorer"; proc.StartInfo.Arguments = "c:\cartella"; proc.Start(); } catch (Exception) { }

nel tuo caso nel processo ci starebbe il programma scelto e in argomenti il file estratto dal database....

--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

Dopo varie ricerche effettuate sono riuscito ad arrivare un punto in cui ho a disposizione la grandezza del file in byte...da qui,come posso fare per visualizzare il file?

il codice che utilizzo è il seguente:

byte[] returnValue = null;

using (FileStream fr = new FileStream(fileName, FileMode.Open))
{
using (BinaryReader br = new BinaryReader(fr))
{
returnValue = br.ReadBytes((int)fr.Length);
}
}

return returnValue;

StefanoRicci Profilo | Junior Member

scusa, ma con quel codice tu apri il file binario e lo leggi, non lo fai aprire ad un altro processo (notepad, word...), se lo vuoi fare aprire ad altri software devi salvare il file che ti ritorna dalla query in una cartella temporanea, rinominarlo con il nome che aveva prima che tu lo mettessi nel database, quindi lanciare l'apertura tramite il software esterno di tuo piacimento con il codice che ti ho messo nel posto sopra
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

il codice che mi avevi postato prima l'ho provato e funziona.
Ora,mi è stato chiesto,partendo dal numero di byte di un file qualsiasi fare la stessa cosa...io sono arrivato ad avere la grandezza del file in bytes ma non riesco ad aprirlo.

StefanoRicci Profilo | Junior Member

ma di quel file qualsiasi cosa sai di preciso?

se è un file binario senza nessun riferimento non è facile determinare quale sia la sua reale natura...
ci stava un applicazione sotto linux che tentava una cosa di questo tipo, ma non so se sia portabile in winows... in pratica scandiva il file e cercava riferimenti che riconducessero ad una particolare estensione...
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

sono di nuovo qui,spero per poco,a disturare...
partendo da un file presente in memoria,sono riuscito a leggerne i byte,creare un file di prova con la stessa estensione(gli passio il percorso completo)..ma non riesco a scrivere il contenuto del file di origine nel file di arrivo.
il codice che utilizzo è il seguente:

FileStream fsout=new FileStream ("C:\\Documents and Settings\\cgreen\\Desktop\\Prova.xlsx",FileMode.Create);
BinaryWriter bw=new BinaryWriter (fsout);
bw.Write(br.ReadBytes((int) fr.Length ));
bw.Close ();
br.Close();

come ho detto mi crea il file di arrivo nel percorso che gli passo,ma quando vado ad aprirlo mi appare un messaggio del tipo:

"Excel cannot open the file <Prova.xlsx> because the file format or file extension is not valid.Verify that the file has notbeen corrupted and that the file extension matches the format of the file."

Secondo voi,cosa sto sbagliando?

StefanoRicci Profilo | Junior Member

come mantieni il dato binario in memoria quando lo carichi?

usi un buffer di che tipo, e quando scrivi lo scrivi nella direzione corretta?

prova a usare la modalità seriale per bufferarlo, oppure creati un array e scrivi l'array direttamente

prova a fare un test con un immagine, e vedi che succede
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

la mia procedura completa,che sto utilizzando è questa:

byte[] returnValue = null;
using (FileStream fr = new FileStream(fileName, FileMode.Open))
{
using (BinaryReader br = new BinaryReader(fr))
{
try
{
returnValue = br.ReadBytes((int)fr.Length);
FileStream fsout = new FileStream("C:\\Documents and Settings\\cgreen\\Desktop\\Prova.docx", FileMode.Create);
BinaryWriter bw=new BinaryWriter (fsout);
bw.Write(br.ReadBytes((int) fr.Length ));
bw.Close ();
br.Close();
}
catch (Exception ect)
{
Globals.HandleException(ect, true);
throw;
}
}
}
return returnValue;

sto sbagliando qualcosa?...dove?

StefanoRicci Profilo | Junior Member

se il file binario fisicamente esiste già rinominalo e vedi se te lo apre, altrimenti prova a legere direttamente il file binario

questo codice legge degli i9nteri, tu basta che sostituisci il riferimento con il byte, e ti salvi nell'array l byte letto, successivamente scarica l'array nella fase di salvataggio

// 1. using (BinaryReader b = new BinaryReader(File.Open("file.bin", FileMode.Open))) { // 2. // Position and length variables. int pos = 0; // 2A. // Use BaseStream. int length = (int)b.BaseStream.Length; while (pos < length) { // 3. // Read integer. int v = b.ReadInt32(); // 4. // Advance our position variable. pos += sizeof(int); } }
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

esiste il file da cui parto...
nel senso che io dovrei aprire il file presente in un Db,leggerlo aprirne una copia momentanea,fare eventuali modifiche e salvarlo.
il file momentaneo,me lo apre..ma vuoto.

StefanoRicci Profilo | Junior Member

ok, quindi, dalla query hai controllato che ti torni effettivamente il file, il problema potrebbe essere li magari, perchè se non ti apre il file momentanoo che non è altro che il risultato iniziale della query magari ti perdi qualcosa per strada in quel punto....
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express

eddyG Profilo | Junior Member

guardando meglio,ho notato che il metodo READBYTES prende in ingresso,oltre che il BynaryReader,anche il punto di partenza da cui partire e il numero totale di byte da leggere...
la seguente istruzione:

bw.Write(br.ReadBytes((int)fr.Length), 0,(int) fr.Length); in cui 0 è il punto iniziale da dove leggere e (Int) fr.lenght è la lunghezza totale da leggere.

però,mi genera il seguente errore:

{"Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."}
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5