2009-06-07 93 views
2

如何以编程方式在SQL SERVER 2005数据库中存储.zip文件?在SQL SERVER 2005中存储和检索.ZIP文件

以及如何找回它?

如果你认为存储.zip文件到数据库不是一个优雅的方式,请告诉我

做一个更好的方法/标准的做法相同

的想法,我正在使用C# ,Asp.net和SQL Server 2005

请给我的代码。

回答

5

有几种方法可以使用。最简单的方法是将文件保留在文件系统中,并将文件路径存储在SQL Server中。您的应用程序将在运行时检索文件路径,并使用所述路径加载文件。虽然存储在文件系统中也有缺点 - 文件不会与数据库一起备份,文件位置的更改或文件删除不会更新SQL Server等等。

存储在SQL Server中当然也是一种选择。您使用的是SQL Server 2005,因此您将无法使用FILESTREAM功能(在SQL Server 2008中引入),但您可以将其存储在本机SQL Server Blob类型中。

这里的a good introduction是Denny Cherry在SQL Server中的blob类型。 这是使用C#编写blob的an example

+0

这是一个很好的答案。谢谢你,亚伦。我认为介绍链接已损坏。 – bernie 2009-06-07 03:12:47

2

可以存储在SQL Server中的一个VARBINARY(MAX)列的二进制文件2005或2008。您也可以使用IMAGE列(这是直到SQL Server 2005中的唯一选项),但会少高性能。

这是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(); 
     } 
    } 
}