如何以编程方式在SQL SERVER 2005数据库中存储.zip文件?在SQL SERVER 2005中存储和检索.ZIP文件
以及如何找回它?
如果你认为存储.zip文件到数据库不是一个优雅的方式,请告诉我
做一个更好的方法/标准的做法相同
的想法,我正在使用C# ,Asp.net和SQL Server 2005
请给我的代码。
如何以编程方式在SQL SERVER 2005数据库中存储.zip文件?在SQL SERVER 2005中存储和检索.ZIP文件
以及如何找回它?
如果你认为存储.zip文件到数据库不是一个优雅的方式,请告诉我
做一个更好的方法/标准的做法相同
的想法,我正在使用C# ,Asp.net和SQL Server 2005
请给我的代码。
有几种方法可以使用。最简单的方法是将文件保留在文件系统中,并将文件路径存储在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。
在SQL Server 2005上,根据zip文件的大小,可以使用varbinary(max)。 Here is a decent example。
可以存储在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();
}
}
}
这是一个很好的答案。谢谢你,亚伦。我认为介绍链接已损坏。 – bernie 2009-06-07 03:12:47