2009-06-07 6 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ブロブタイプに格納することができます。

ここではDenny CherryのSQL ServerのBLOB型にa good introductionがあります。 C#でBLOBを書くのはan exampleです。

+0

これはすばらしい答えです。アロンに感謝します。私はイントロのリンクが壊れていると思う。 – bernie

+0

ちょうどチェックされました。数分後にもう一度お試しになるか、別のブラウザを使用してください。 –

+0

反対の議論も真実です。致命的な回復では、DBがオンラインに戻る前にすべてのファイルがリストアされるのを待つ必要がありますか?場合によっては、場合によっては、アプリケーションによって異なります。通常、私はdbをできるだけ早く復元したいと思っています。 – ahains

2

SQL Server 2005または2008のVARBINARY(MAX)列にバイナリファイルを格納できます。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(); 
     } 
    } 
}