Zipper des BLOB sans copier les fichiers temporairement sur le disque dur [Résolu]

Signaler
Messages postés
12
Date d'inscription
lundi 21 juillet 2003
Statut
Membre
Dernière intervention
12 février 2009
-
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
-
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

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Essaye de passer par un MemoryStream

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
Messages postés
12
Date d'inscription
lundi 21 juillet 2003
Statut
Membre
Dernière intervention
12 février 2009

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();
 }
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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]
Messages postés
12
Date d'inscription
lundi 21 juillet 2003
Statut
Membre
Dernière intervention
12 février 2009

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
Messages postés
12
Date d'inscription
lundi 21 juillet 2003
Statut
Membre
Dernière intervention
12 février 2009

J'ai trouvé,
il fallait tout simplement repositionner le memorystream à 0
fileMemoryStream.Position = 0;

Merci pour ton aide
Messages postés
12
Date d'inscription
lundi 21 juillet 2003
Statut
Membre
Dernière intervention
12 février 2009

entre Ferrand (pour moi c'est sans le d à la fin) on se comprend
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]