2012-07-04 6 views
6

Chcę zapisać wielowymiarową tablicę bajtów w bazie danych SQL Server.Zapisywanie wielowymiarowej tablicy bajtów w bazie danych SQL Server

Wiem, jak zapisać tablicę bajtów, która jest konwersją obrazu do bazy danych. W tym przypadku użyłem typu danych: image. Ale teraz chcę przechowywać kolejną tablicę bajtów, która jest wielowymiarową tablicą bajtową byte [,] temp, która ma dwa wymiary z wartościami x, y.

Szukałem w Internecie i tutaj, mówi się, że przy użyciu formatu VARBINARY. Wszystko, co chcę wiedzieć, to czy zapisując tablicę wielowymiarową w kolumnie danych typu danych VARBINARY, czy wartości zostaną zmienione? Czy można ponownie otrzymać dane z powrotem jako tablicę wielowymiarową?

+1

'IMAGE' jest przestarzałe - dla SQL Server ** 2005 i nowszych **, powinieneś ** zawsze ** używać' VARBINARY (MAX) 'do przechowywania dowolnego typu binarnego - czy to pojedynczy obraz czy tablica wielowymiarowa. I ** nie ** twoje dane ** nie ** zostaną zmienione w jakikolwiek sposób - bajtów, bajtów, dokładnie tak, jak je wstawiłeś na pierwszym miejscu –

+0

Niesamowite dzięki .. To było naprawdę pomocne ... I jeden więcej dlaczego mówisz, że IMAGE jest przestarzałe? Czy jest jakaś wada korzystania z IMAGE ..? Używam serwera sql 2005 – Gihan

+1

PS: I googled i dostałem odpowiedź. dzięki jeszcze raz. Mam nadzieję, że umieścisz to jako odpowiedź, więc mogę to zaznaczyć. Między tym jest link do bardziej przestarzałych typów danych dla tych, którzy chcą: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/15f9e54c-18af-4f9a-8472-58fbd285a736 – Gihan

Odpowiedz

7

Tak, będziesz w stanie odzyskać swoją niezmienioną tablicę wielowymiarową.

Jak możesz to zrobić? Korzystanie z pola Varbinary (max) w Sql Server i zapisywanie w nim szeregowej wielowymiarowej tablicy bajtów. Aby odzyskać tablicę, musisz zdywersyfikować to, co zapisałeś w bazie danych.

Oto przykład jak to zrobić:

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

Tylko z ciekawości, jak czy faktycznie konwertujesz bajt [,] na bajt [] podczas przechowywania/pobierania z SQL Server w ADO.NET? Myślałem, że varbinary() akceptuje tylko bajt [], a nie bajt [,]. –

+0

Powiedziałbym, że znając wymiary, bajt [a, b] jest niczym więcej niż bajtem [a * b] ... – Kek

+0

Tak, i "znajomość wymiarów" jest tutaj kluczowym punktem. Jak SQL powinien wiedzieć, jak podzielić varbinary (n) na bajt [,] (varbinary (10) może być bajtem [1,10], bajtem [2,5], bajtem [5,2], bajtem [10,1] ...). –

2

co wiem nie jest odpowiedni typ danych w programie Microsoft SQL Server do przechowywania tablice wielowymiarowe. Istnieje jednak wiele sposobów na zapisanie informacji o strukturze macierzy. Niektóre z nich

  1. utworzyć kilka kolumn dwuskładnikowych (stała na całej długości), typ danych i każdy rzędu swojej wielowymiarowej tablicy do odpowiedniej kolumny; w tym przypadku oczekuje się, że liczba wierszy w twojej tablicy będzie stała;

  2. sklepu cały zestaw w jednowymiarowej tablicy w jednej kolumnie Varbinary (o zmiennej długości) Typ danych i umieścić w oddzielnej kolumnie danych typu int liczbę elementów w każdym rzędzie wielowymiarowej tablicy; w tym przypadku oczekuje się, że liczba elementów w każdym rzędzie będzie taka sama (nie postrzępiona tablica C#); czytając tablicę , będzie można dzielić elementy o tej długości na oddzielnych rzędów wielowymiarowej tablicy.

+0

Więc to, co masz na myśli, to gdy otrzymamy zapisaną wielowymiarową tablicę z bazy danych, otrzymamy ją jako tablicę jednowymiarową i musimy ją zmienić, aby stworzyć oryginalną tablicę wielowymiarową wykorzystującą zapisaną liczbę elementów w stanie surowym ...? – Gihan

+1

Tak, nie można wstawić tablicy wielowymiarowej "jak jest" do kolumny, a następnie ją odzyskać. Jeśli jest wysoce wymagane, aby uzyskać wielowymiarową tablicę, można pobrać jednowymiarową tablicę z bazy danych i przetworzyć ją przy użyciu C#, aby utworzyć wielowymiarową. Na przykład jeśli przechowujesz 5 jako liczbę elementów w wierszu, a całkowita liczba elementów w przechowywanej tablicy wynosi 20, będziesz mógł skopiować 5 elementów z pobranej tablicy i umieścić je w tablicy wierszy. Na koniec będziesz mieć tablicę [4, 5]. – Ivan

+0

Ok dzięki za wgląd. Dokładnie to miałem. Ale po wcześniejszych odpowiedziach myślałem, że VARBINAY w jakiś sposób radzi sobie z konfliktem typu danych. Spróbuję to wdrożyć i sprawdzić. Jeszcze raz dziękuję!! PS (w górę głosuj na problem, jeśli możesz) – Gihan

Powiązane problemy