2012-07-04 7 views
6

Desidero salvare un array di byte multidimensionale in un database di SQL Server.Salvataggio di array di byte multidimensionali nel database di SQL Server

so come salvare un array di byte che è una conversione di immagini a un database. Per questo il tipo di dati che ho usato è image. Ma ora voglio memorizzare un altro array di byte che è array di byte multidimensionale byte [,] temp, che ha due dimensioni con valori x, y.

ho cercato su internet e qui, si dice che utilizzando il formato VARBINARY. Tutto quello che voglio sapere è che se salgo il mio array multidimensionale in una colonna di dati di tipo VARBINARY, i valori verranno modificati? È possibile ricevere nuovamente i dati come array multidimensionale?

+1

'IMAGE' è deprecato - per SQL Server ** ** 2005 e più recente, si dovrebbe sempre ** ** usare' varbinary (max) 'per la memorizzazione di qualsiasi tipo binario - se questo è una singola immagine o un matrice multidimensionale. E ** no ** i tuoi dati non saranno ** alterati in alcun modo - byte in, byte fuori, esattamente come li metti in primo piano –

+0

Grazie fantastici .. E 'stato davvero utile ... E uno più cosa perché dici che IMAGE è deprecato .. C'è qualche svantaggio nell'usare IMAGE ..? Sto usando SQL Server 2005 – Gihan

+1

PS: ho cercato su Google e ho ottenuto la risposta. grazie ancora. Spero che tu metta questa risposta come risposta, così posso farcela. Tra ecco il link per i tipi di dati più obsolete per chi vuole: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/15f9e54c-18af-4f9a-8472-58fbd285a736 – Gihan

risposta

7

Sì, si sarà in grado di ottenere indietro il vostro array multi-dimensionale inalterata.

Come si può fare? Utilizzo di un campo Varbinary (max) in Sql Server e salvataggio in esso della matrice di byte multidimensionale serializzata. Al fine di riavere il tuo array, ovviamente, devi deserializzare ciò che hai archiviato nel database.

Ecco un esempio di come farlo:

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

solo di curiosità, come convertite effettivamente byte [,] in byte [] durante l'archiviazione/recupero da SQL Server in ADO.NET? Ho pensato che varbinary() accetta solo byte [] e non byte [,]. –

+0

Direi che, conoscendo le dimensioni, un byte [a, b] non è altro che un byte [a * b] ... – Kek

+0

Sì, e "conoscere le dimensioni" è il punto chiave qui. Come dovrebbe SQL sapere come dividere varbinary (n) in byte [,] (varbinary (10) potrebbe essere byte [1,10], byte [2,5], byte [5,2], byte [10,1] ...). –

2

Per quanto ne so non c'è nessun tipo di dati appropriato in Microsoft SQL Server per archiviare array multidimensionali. Tuttavia ci sono molti modi per salvare informazioni sulla struttura dell'array. Alcuni di loro:

  1. creare diverse colonne di BINARIO (lunghezza fissa) tipo di dati e ogni riga della matrice pluridimensionale colonna appropriata; in questo caso ci si aspetta che il numero di righe dell'array sia costante;

  2. negozio tutta matrice come matrice unidimensionale in un'unica colonna di VARBINARY (lunghezza variabile) tipo di dati e conservare in colonna separata dei dati INT digitare il conteggio di elementi in ciascuna fila di array multidimensionale; in questo caso ci si aspetta che il conteggio degli elementi in ogni riga sia lo stesso (non l'array C# frastagliato); quando si legge l'array , sarà possibile suddividere gli elementi di questa lunghezza in righe separate di array multidimensionale.

+0

Quindi, quello che intendi è quando recuperiamo la matrice multidimensionale salvata dal database, la riceveremo come una matrice di una dimensione e dobbiamo modificarla per fare in modo che l'array multidimensionale originale utilizzi il numero di elementi di salvataggio in un grezzo ..? – Gihan

+1

Sì, non è possibile mettere la matrice multidimensionale "così com'è" nella colonna e quindi recuperarla. Se è necessario ottenere array multidimensionali, è possibile recuperare un array monodimensionale dal database ed elaborarlo utilizzando C# per creare un multidimensionale. Ad esempio, se si memorizza 5 come numero di elementi nella riga e il numero totale di elementi nell'array memorizzato è 20, sarà possibile copiare ogni 5 elementi dall'array recuperato e inserirli nell'array di righe. Alla fine avrai la matrice [4, 5]. – Ivan

+0

Ok, grazie per l'intuizione. Questo è il problema esatto che ho avuto. Ma dopo le risposte precedenti ho pensato che VARBINAY gestisse in qualche modo il conflitto dei tipi di dati. Proverò a implementarlo e a controllare. Grazie ancora ..! PS (su vota il problema se puoi) – Gihan