Как сохранить .zip файл в базе данных SQL SERVER 2005 программно?
И как вернуть его обратно?
Если вы считаете, что сохранение ZIP файла в базе данных не является изящным способом, скажите мне
идея сделать лучший подход/стандартную практику для того же
Я использую С#, Asp.net и Sql Server 2005
Пожалуйста, пришлите мне код.
Существует несколько методов, которые вы можете использовать. Самое простое - оставить файлы в файловой системе и сохранить путь к файлу внутри SQL Server. Ваше приложение будет извлекать путь к файлу во время выполнения и использовать указанный путь для загрузки файла. Тем не менее, хранение в файловой системе также имеет свои недостатки: файлы не архивируются с базой данных, изменениями в местоположении файла или удалением файлов не будут обновляться SQL Server и т.д.
Сохранение в SQL Server также является опцией. Вы находитесь на SQL Server 2005, так что вы не сможете использовать функцию FILESTREAM (представленную в SQL Server 2008), но вы сможете сохранить ее в собственном типе блочного SQL Server.
Здесь хорошее введение в типы blob в SQL Server от Denny Cherry. Здесь пример написания blobs с использованием С#.
Вы можете сохранить двоичный файл в столбце VARBINARY(MAX)
в SQL Server 2005 или 2008. Вы также можете использовать столбец IMAGE
(который был единственным вариантом до SQL Server 2005), но это будет менее результативным.
Вот суть в коде, совместимом с С# 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();
}
}
}
В SQL Server 2005, в зависимости от размера zip файла, вы можете использовать varbinary (max). Вот достойный пример.