2009-06-07 4 views
2

Comment stocker le fichier .zip dans la base de données SQL Server 2005 par programmation?Stocker et récupérer le fichier .ZIP dans SQL Server 2005

Et comment le récupérer?

Si vous pensez que le stockage d'un fichier .zip dans une base de données est une façon élégante, s'il vous plaît me dire

l'idée de faire une meilleure approche/pratique standard pour la même

Je suis en utilisant C# , Asp.net et Sql Server 2005

Veuillez m'envoyer le code.

Répondre

5

Il existe plusieurs méthodes que vous pouvez utiliser. Le plus simple consiste à laisser les fichiers sur le système de fichiers et à stocker le chemin du fichier dans SQL Server. Votre application récupère le chemin du fichier lors de l'exécution et utilise ce chemin pour charger le fichier. Le stockage dans le système de fichiers présente également des inconvénients: les fichiers ne sont pas sauvegardés avec la base de données, les modifications apportées à l'emplacement du fichier ou la suppression du fichier ne mettra pas à jour SQL Server, etc.

Le stockage dans SQL Server est certainement également une option. Vous êtes sur SQL Server 2005, vous ne pourrez donc pas utiliser la fonctionnalité FILESTREAM (introduite dans SQL Server 2008), mais vous pourrez la stocker dans un type de blob SQL Server natif.

Voici a good introduction pour blob types dans SQL Server par Denny Cherry. Voici an example d'écrire des blobs en utilisant C#.

+0

Ceci est une excellente réponse. Merci Aaron. Je pense que le lien d'intro est cassé. – bernie

+0

Juste vérifié - ils ont tous deux l'air OK. Réessayer dans quelques minutes ou peut-être utiliser un navigateur différent? –

+0

L'argument opposé est également vrai: dans une récupération catastrophique, voulez-vous attendre que tous vos fichiers soient restaurés avant que la base de données ne soit remise en ligne? Parfois oui, parfois non, cela dépend de l'application. Typiquement, je voudrais que le db soit restauré le plus rapidement possible. – ahains

2

Vous pouvez stocker un fichier binaire dans une colonne VARBINARY(MAX) dans SQL Server 2005 ou 2008. Vous pouvez également utiliser une colonne IMAGE (qui était la seule option jusqu'à SQL Server 2005) mais qui sera moins performant.

Voici l'essentiel du code compatible C# 1.0.

create table TBL_ZIP_BLOB 
(
    ID unqiuidentifier primary key clustered not null 
     default newid() 
    ,BLOB varbinary(max) not null, 
    ,NAME nvarchar(255) not null 
) 

public void InsertZipBlob(Guid id, byte[] bytes, string name) 
{ 
    SqlDbCommand.CommandText = @"insert into TBL_ZIP_BLOB(BLOB,NAME) values(@blob,@name)"; 

    using(SqlCommand cmd = MethodToGetValidCommandObject()) 
    { 
     cmd.CommandText = "insert into TBL_ZIP_BLOB(ID, BLOB,NAME) values(@id,@blob,@name)"; 
     cmd.Parameters.Add("@id",SqlDbType.UniqueIdentifier).Value = id; 
     cmd.Parameters.Add("@blob",SqlDbType.Image).Value  = bytes; 
     cmd.Parameters.Add("@name",SqlDbType.NVarChar,128).Value = name; 
     cmd.ExecuteNonQuery(); 
    } 
} 

public void SendZipBlobToResponse(Guid id, HttpResponse response) 
{ 
    byte[] bytes = new byte[0]; 
    string name = "file.zip"; 

    using(SqlCommand cmd = MethodToGetValidCommandObject()) 
    { 
     cmd.ComandText = "select BLOB,NAME from TBL_ZIP_BLOB where ID = @id"; 
     cmd.Parameters.Add("@id",SqlDbType.UniqueIdentifier).Value = id; 
     using(IDataReader reader = cmd.ExecuteReader()) 
     { 
      if(reader.Read()) 
      { 
       name = (string)reader["NAME"]; 
       bytes = (byte[])reader["BLOBIMG"]; 
      } 
     } 
    } 

    if (bytes.Length > 0) 
    { 
     response.AppendHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\""),name); 
     response.AppendHeader("Content-Type","application/zip"); 

     const int CHUNK = 1024; 
     byte[] buff = new byte[CHUNK]; 

     for(long i=0; i<Bytes.LongLength; i+=CHUNK) 
     { 
      if(i+CHUNK > bytes.LongLength) 
       buff = new byte[Bytes.LongLength-i]; 
      Array.Copy(Bytes, i, buff, 0, buff.Length); 
      response.OutputStream.Write(buff, 0, buff.Length); 
      response.OutputStream.Flush(); 
     } 
    } 
} 
Questions connexes