Сохраните и получите файл .ZIP в SQL SERVER 2005

2

Как сохранить .zip файл в базе данных SQL SERVER 2005 программно?

И как вернуть его обратно?

Если вы считаете, что сохранение ZIP файла в базе данных не является изящным способом, скажите мне

идея сделать лучший подход/стандартную практику для того же

Я использую С#, Asp.net и Sql Server 2005

Пожалуйста, пришлите мне код.

Теги:
sql-server-2005

3 ответа

5
Лучший ответ

Существует несколько методов, которые вы можете использовать. Самое простое - оставить файлы в файловой системе и сохранить путь к файлу внутри SQL Server. Ваше приложение будет извлекать путь к файлу во время выполнения и использовать указанный путь для загрузки файла. Тем не менее, хранение в файловой системе также имеет свои недостатки: файлы не архивируются с базой данных, изменениями в местоположении файла или удалением файлов не будут обновляться SQL Server и т.д.

Сохранение в SQL Server также является опцией. Вы находитесь на SQL Server 2005, так что вы не сможете использовать функцию FILESTREAM (представленную в SQL Server 2008), но вы сможете сохранить ее в собственном типе блочного SQL Server.

Здесь хорошее введение в типы blob в SQL Server от Denny Cherry. Здесь пример написания blobs с использованием С#.

  • 0
    Это отличный ответ. Спасибо, Аарон. Я думаю, что вступительная ссылка не работает.
  • 0
    Только что проверил - они оба выглядят хорошо. Повторите попытку через несколько минут или, может быть, используете другой браузер?
Показать ещё 3 комментария
2

Вы можете сохранить двоичный файл в столбце 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();
        }
    }
}
1

В SQL Server 2005, в зависимости от размера zip файла, вы можете использовать varbinary (max). Вот достойный пример.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню