Zipper des BLOB sans copier les fichiers temporairement sur le disque dur

Résolu
denfer06 Messages postés 12 Date d'inscription lundi 21 juillet 2003 Statut Membre Dernière intervention 12 février 2009 - 31 juil. 2008 à 15:41
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 1 août 2008 à 14:10
Bonjour,

Je stocke dans ma base SQL des fichiers en tous genres et je voudrai lorsque j'en ressort plus d'un les zipper.
je récupérer mes données de la base SQL dans un object sqlDataReader mais ensuite je n'ai trouvé aucune solution pour directement zipper ces données.
La seule solution actuelles que j'ai trouvée est d'écrire les fichiers en local sur le disque, zipper puis supprimer les fichiers temporaires.

La question est:
Est ce qu'il est possible à partir d'un sqlDataReader de zipper le flux de données sans passer par la copie sur le disque ?
et si oui comment ?

Merci d'avance

 

7 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
31 juil. 2008 à 16:49
Essaye de passer par un MemoryStream

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
3
denfer06 Messages postés 12 Date d'inscription lundi 21 juillet 2003 Statut Membre Dernière intervention 12 février 2009
1 août 2008 à 09:53
En effet ça semble convenir à mes besoins.
est ce que tu as un exemple pour remplir un memoryStream à partir d'un SqlDataReader ?
je m'y perds un peu dans les parametres et autres bytebuffer
je n'arrive pas a définir la taille de mon memorystream

voila mon code:
// Prepares buffers and reading variables.
int bufferSize = 100;long startIndex 0, readSize 0, totalSize = 0;
byte[] byteBuffer = new byte[bufferSize];


 try
 {
  downloadCommand.Connection.Open();


  sqlDataReader = downloadCommand.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);


  if (!sqlDataReader.Read() || sqlDataReader.IsDBNull(0))
   throw new Exception("No " + downloadedObject + " found!\nPlease contact the system administrator.");


  MemoryStream fileMemoryStream = new MemoryStream();


  totalSize = sqlDataReader.GetBytes(0, startIndex, null, 0, 0);
  readSize = sqlDataReader.GetBytes(0, startIndex, byteBuffer, 0, bufferSize);
  // Continue reading and writing while there are bytes beyond the size of the buffer.
  while (readSize == bufferSize)
  {
   fileMemoryStream.Write(byteBuffer, (int)startIndex, (int)(readSize));
   fileMemoryStream.Flush();                   


   // Reposition the start index to the end of the last buffer and fill the buffer.
   startIndex += bufferSize;
   readSize = sqlDataReader.GetBytes(0, startIndex, byteBuffer, 0, bufferSize);
  }


  // Write the remaining buffer.
  fileMemoryStream.Write(byteBuffer, (int)startIndex, (int)(readSize));
  fileMemoryStream.Flush();               
 }
 catch (Exception excpt)
 {
  throw excpt;
 }
 finally
 {
  downloadCommand.Connection.Close();
 }
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
1 août 2008 à 09:57
ton blob... c'est un byte[] !

donc, normalement :

MemoryStream ms = new MemoryStream((byte[])reader["MonBlob"]);

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
0
denfer06 Messages postés 12 Date d'inscription lundi 21 juillet 2003 Statut Membre Dernière intervention 12 février 2009
1 août 2008 à 10:33
j'ai changé la commande :
fileMemoryStream.Write(byteBuffer, (int)startIndex, (
int)(readSize));

par
fileMemoryStream.Write(byteBuffer, 0, (
int)(readSize));

et ça semble aller plus loin
mon zip est créé mais je ne peux pas récuperer les fichiers:
les fichiers semblent corrompu : Invalide compressed data to inflate

size, ratio, packedsont à 0 => pas bon signe

si tu as une idée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
denfer06 Messages postés 12 Date d'inscription lundi 21 juillet 2003 Statut Membre Dernière intervention 12 février 2009
1 août 2008 à 13:57
J'ai trouvé,
il fallait tout simplement repositionner le memorystream à 0
fileMemoryStream.Position = 0;

Merci pour ton aide
0
denfer06 Messages postés 12 Date d'inscription lundi 21 juillet 2003 Statut Membre Dernière intervention 12 février 2009
1 août 2008 à 13:58
entre Ferrand (pour moi c'est sans le d à la fin) on se comprend
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
1 août 2008 à 14:10
Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
0
Rejoignez-nous