Сохраните и получите файл .ZIP в SQL SERVER 2005 - PullRequest
2 голосов
/ 07 июня 2009

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

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

Если вы считаете, что сохранение файла .zip в базу данных - это не элегантный способ, скажите мне

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

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

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

Ответы [ 3 ]

5 голосов
/ 07 июня 2009

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

Хранение в SQL Server, безусловно, также возможно. Вы работаете на SQL Server 2005, поэтому вы не сможете использовать функцию FILESTREAM (представлена ​​в SQL Server 2008), но вы сможете сохранить ее в собственном типе BLOB-объекта SQL Server.

Вот хорошее введение к типам BLOB-объектов в SQL Server от Денни Черри. Вот пример написания больших двоичных объектов с использованием C #.

2 голосов
/ 07 июня 2009

Вы можете сохранить двоичный файл в столбце VARBINARY(MAX) в SQL Server 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();
        }
    }
}
1 голос
/ 07 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...