2012-07-04 28 views
6

Quiero guardar una matriz de bytes multidimensional en una base de datos de SQL Server.Guardar matriz de bytes multidimensional en la base de datos de SQL Server

Sé cómo guardar una matriz de bytes que es una conversión de imagen a una base de datos. Para eso, el tipo de datos que utilicé es image. Pero ahora quiero almacenar otra matriz de bytes que es una matriz de bytes multidimensional byte [,] temp, que tiene dos dimensiones con valores x, y.

He buscado en Internet y aquí, se dice que usando el formato VARBINARY. Todo lo que quiero saber es si guardo mi matriz multidimensional en una columna de datos de tipo de datos VARBINARY, ¿se alterarán los valores? ¿Es posible volver a recibir los datos como una matriz multidimensional?

+1

'IMAGE' está en desuso - para SQL Server 2005 y versiones posteriores ** **, debe ** ** Siempre usar' varbinary (max) 'para almacenar cualquier tipo binario - ya sea una sola imagen o una matriz multidimensional. Y ** no ** tus datos ** no ** serán alterados de ninguna manera - bytes adentro, bytes fuera, exactamente como los pones en primer lugar –

+0

Gracias increíbles ... Fue realmente útil ... Y uno más por qué dices IMAGE está en desuso ... ¿Hay alguna desventaja de usar IMAGE ..? Estoy usando sql server 2005 – Gihan

+1

PD: busqué en Google y obtuve la respuesta. gracias de nuevo. Espero que pongas esto como respuesta para poder marcarlo. Aquí está el enlace para más tipos de datos en desuso para los que quieran: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/15f9e54c-18af-4f9a-8472-58fbd285a736 – Gihan

Respuesta

7

Sí, podrá recuperar su matriz multidimensional sin modificaciones.

¿Cómo se puede hacer? Utilizando un campo Varbinary (max) en el servidor Sql y guardando en él la matriz de bytes multidimensional serializada. Para recuperar su matriz, obvio, necesita deserializar lo que almacenó en la base de datos.

Aquí es un ejemplo de cómo hacerlo:

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

Simplemente por curiosidad, ¿cómo? ¿realmente se convierte byte [,] en byte [] cuando se almacena/recupera desde SQL Server en ADO.NET? Pensé que varbinary() solo acepta byte [] y no byte [,]. –

+0

Diría que, conociendo las dimensiones, un byte [a, b] no es más que un byte [a * b] ... – Kek

+0

Sí, y "conocer las dimensiones" es un punto clave aquí. ¿Cómo debe SQL saber cómo dividir varbinary (n) en byte [,] (varbinary (10) podría ser byte [1,10], byte [2,5], byte [5,2], byte [10,1] ...). –

2

Como sé que no hay ningún tipo de datos adecuado en Microsoft SQL Server para almacenar las matrices multidimensionales. Sin embargo, hay muchas maneras de guardar información sobre la estructura de la matriz. Algunos de ellos:

  1. crear varias columnas de binario (de longitud fija) de tipo de datos y cada fila de la matriz multidimensional a la columna apropiada; en este caso , se espera que el recuento de filas en su matriz sea constante;

  2. tienda de toda la matriz como matriz unidimensional en una sola columna de VARBINARY (de longitud variable) tipo de datos y almacenar en columna separada de datos INT escriba el recuento de elementos en cada fila de matriz multidimensional; en este caso, se espera que el recuento de elementos en cada fila sea el mismo (no un array C# irregular); al leer la matriz , podrá dividir los elementos por esta longitud en filas separadas de matriz multidimensional.

+0

Entonces, ¿qué quiere decir es que cuando recuperamos la matriz multidimensional guardada de la base de datos, la recibiremos como una matriz de una dimensión y tenemos que modificarla para hacer que la matriz multidimensional original use la cantidad de elementos guardados en bruto ...? – Gihan

+1

Sí, no puede poner una matriz multidimensional 'tal cual' en la columna y luego recuperarla. Si es muy necesario obtener una matriz multidimensional, puede recuperar una matriz unidimensional de la base de datos y procesarla usando C# para crear una imagen multidimensional. Por ejemplo, si almacena 5 como un recuento de elementos en la fila y el recuento total de elementos en la matriz almacenada es 20, podrá copiar cada 5 elementos de la matriz recuperada y ponerlos en fila-matriz. Al final tendrás [4, 5] matriz. – Ivan

+0

Ok gracias por la información. Ese es el problema exacto que tuve. Pero después de las respuestas anteriores, pensé que VARBINAY maneja de alguna manera el conflicto de tipo de datos. Intentaré implementar esto y verificaré. Gracias de nuevo ...! PS (hasta vote el problema si puede) – Gihan

Cuestiones relacionadas