2012-07-04 6 views
6

多次元バイト配列をSQL Serverデータベースに保存します。多次元バイト配列をSQL Serverデータベースに保存する

私はデータベースへの画像変換であるバイト配列を保存する方法を知っています。そのため私が使用したデータタイプはimageです。しかし今は、多次元バイト配列byte [,] tempである別のバイト配列を格納するとします。この配列は、x、y値を持つ2つの次元を持ちます。

インターネットで検索しましたが、ここではVARBINARYフォーマットを使用しています。私が知りたいのは、多次元配列をVARBINARYデータ型のデータ列に保存すれば、値が変更されますか?再度多次元配列としてデータを受け取ることは可能ですか?

+1

'IMAGE'は廃止されました - SQL Server ** 2005以降で**バイナリタイプを保存するには常に** VARBINARY(MAX)を使用する必要があります。多次元配列。 ** **あなたのデータは**どのような方法でも変更されません** - 最初の場所に置いたバイト数、バイトアウト、正確に –

+0

本当に助かりました。なぜIMAGEは廃止されたと言いますか..イメージを使用することの欠点はありますか?私はSQL Server 2005を使用しています – Gihan

+1

PS:私はグーグルで答えを得ました。再度、感謝します。私はそれに目を向けることができるようにこれを答えとして入れて欲しい。ここには、非難されたデータ型のためのリンクがあります。http://social.msdn.microsoft.com/Forums/en/transactsql/thread/15f9e54c-18af-4f9a-8472-58fbd285a736 – Gihan

答えて

7

はい、変更されていない多次元配列を返すことができます。

どうすればいいですか? Sql ServerのVarbinary(max)フィールドを使用し、シリアル化された多次元バイト配列を保存します。あなたの配列を元に戻すには、データベースに格納されているものを逆シリアル化する必要があります。ここで

はそれを行う方法の例です:

public void TestSO() 
{ 
    using (SqlConnection conexion = new SqlConnection()) 
    { 
     using (SqlCommand command = new SqlCommand()) 
     { 
      //This is the original multidimensional byte array 
      byte[,] byteArray = new byte[2, 2] {{1, 0}, {0,1}}; 
      ConnectionStringSettings conString = ConfigurationManager.ConnectionStrings["ConnectionString"]; 
      conexion.ConnectionString = conString.ConnectionString; 
      conexion.Open(); 
      command.Connection = conexion; 
      command.CommandType = CommandType.Text; 
      command.CommandText = "UPDATE Table SET VarBinaryField = @Content WHERE Id = 73 "; 
      command.Parameters.Add(new SqlParameter("@Content", SqlDbType.VarBinary, -1)); 
      //Serialize the multidimensional byte array to a byte[] 
      BinaryFormatter bf = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(); 
      bf.Serialize(ms, byteArray); 
      //Set the serialized original array as the parameter value for the query 
      command.Parameters["@Content"].Value = ms.ToArray(); 
      if (command.ExecuteNonQuery() > 0) 
      { 
       //This method returns the VarBinaryField from the database (what we just saved) 
       byte[] content = GetAttachmentContentsById(73); 
       //Deserialize Content to a multidimensional array 
       MemoryStream ms2 = new MemoryStream(content); 
       byte[,] fetchedByteArray = (byte[,])bf.Deserialize(ms2); 
       //At this point, fetchedByteArray is exactly the same as the original byte array 
      } 
     } 
    } 
} 
+0

ちょうど好奇心、どのようにあなたは実際にバイト[、]をバイト[]に変換するのですか?ADO.NETのSQL Serverからのストア/私はvarbinary()はbyte []だけではなく、byte []を受け入れると考えました。 –

+0

サイズを知っていると、バイト[a、b]はバイトだけです。[a * b] ... – Kek

+0

はい、「寸法を知る」はここのポイントです。 varbinary(10)は、バイト[1,10]、バイト[2,5]、バイト[5,2]、バイト[10,1]のいずれかである可能性があります。 ...)。 –

2

私は多次元配列を格納するために、Microsoft SQL Serverには、適切なデータ型がありません知っているよう。しかし、配列構造に関する情報を保存する方法はたくさんあります。それらのいくつか:

  1. は、BINARY(固定長)データ型と適切な列への多次元アレイの各 行の複数の列を作成します。この の場合、配列の行数は一定であることが予想されます。一次元アレイとして

  2. ストアアレイ全体別の列に VARBINARY(可変長)データ型とストアの単一の列INTデータタイプの に 多次元アレイの各列の要素の数。この場合、各行の 要素の数は同じであると予想されます(ぎざぎざのC#配列ではありません)。 配列を読み込むと、この長さで要素を複数の多次元配列の 個の行に分割することができます。

+0

つまり、データベースから保存された多次元配列を取得すると、それを1次元配列として受け取り、元の多次元配列を生の配列の保存番号を使用して変更する必要があります。 – Gihan

+1

はい、多次元配列を 'そのまま'の列に配置してから戻すことはできません。多次元配列を強く要求する必要がある場合は、データベースから1次元配列を取得し、C#を使用してそれを処理して多次元を作成することができます。たとえば、行の要素の数として5を格納し、格納された配列の要素の合計数が20の場合、取得した配列から5つの要素をそれぞれコピーして、行配列に配置できます。最後に[4,5]配列があります。 – Ivan

+0

洞察力に感謝します。それは私が持っていた正確な問題です。しかし、以前の答えの後、私はVARBINAYが何らかの形でデータ型の競合を処理すると考えました。私はこれを実装してチェックします。ありがとうございました!PS(あなたができれば問題を解決します) – Gihan