2012-07-04 37 views
6

Çok boyutlu bir bayt dizisini SQL Server veritabanına kaydetmek istiyorum.Çok boyutlu bayt dizisini SQL Server veritabanına kaydetme

Veritabanına görüntü dönüştürme olan bayt dizisini kaydetmeyi biliyorum. Bunun için kullandığım veri türü image'dur. Ama şimdi x, y değerleri ile iki boyuta sahip çok boyutlu bayt dizisi byte [,] temp olan başka bir bayt dizisi saklamak istiyorum.

İnternette aradım ve burada VARBINARY formatını kullanıyorum. Tek bilmek istediğim, çok boyutlu dizilimimi VARBINARY veri türü veri sütununda kaydedersem, değerler değiştirilecek mi? Verileri tekrar çok boyutlu dizi olarak almak mümkün mü?

+1

'IMAGE' itiraz edildi - herhangi bir ikili türü saklamak için' ** 2005 ve daha yeni **, sen ** daima ** 'VARBINARY (MAX) kullanmalıdır SQL Server için - yani tek resmim olsun veya bir çok boyutlu dizi. Ve ** hayır ** verileriniz ** herhangi bir şekilde değiştirilemez - baytlık baytlık, tam olarak ilk etapta koyduğunuz gibi baytlar –

+0

Müthiş teşekkürler ... Gerçekten yardımcı oldu ... Ve bir daha fazla şey neden IMAGE denilmiyor diyelim .. IMAGE kullanarak herhangi bir dezavantajı var ..? SQL Server 2005 – Gihan

+1

PS kullanıyorum: Ben googled ve cevabı aldım. Tekrar teşekkürler. Umarım bunu bir cevap olarak koyarsın, böylece onu işaretleyebilirim. Aralarında daha fazla kullanım dışı veri türü için link olanların listesi: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/15f9e54c-18af-4f9a-8472-58fbd285a736 – Gihan

cevap

7

Evet, çok boyutlu dizinizi değiştirmeden geri alabileceksiniz.

Bunu nasıl yapabilirsiniz? Sql Server'da bir Varbinary (max) alanı kullanmak ve seri hale getirilmiş çok boyutlu bayt dizisine kaydetmek. Dizininizi geri almak için, gizlice, veritabanında sakladığınız şeyleri kaldırmanız gerekir. İşte

bunu nasıl örneğidir:

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

Sadece merak, nasıl ADO.NET'te SQL Server'dan saklarken/çıkarırken aslında bayt [] byte [] a dönüştürür müsünüz? Varbinary() sadece bayt [] ve değil bayt [,] kabul ettiğini düşündüm. –

+0

Bunu söyleyebilirim, boyutları bilmek, bir bayt [a, b] bir bayttan başka bir şey değildir [a * b] ... – Kek

+0

Evet ve "boyutları bilmek" burada önemli bir noktadır. SQL, varbinary (n) 'yi bayt [,]' a nasıl bölebileceğini bilmelidir (varbinary (10), bayt olabilir [1,10], bayt [2,5], bayt [5,2], bayt [10,1] ...). –

2

ben çok boyutlu diziler depolamak için Microsoft SQL Server hiçbir uygun veri tipi vardır bildiği gibi. Ancak dizi yapısı hakkında bilgi kaydetmek için birçok yol vardır. Bunlardan bazıları:

  1. ikili (sabit uzunlukta) veri türü ve uygun sütun için çok boyutlu dizinin her sırasının birçok sütunlar oluşturmak; Bu durumunda, dizinizdeki satır sayısının sabit olması bekleniyor;

  2. deposu VARBINARY (değişken uzunluk) boyutlu dizinin her satırda elemanların sayısı tip INT verilerin ayrı bir sütuna veri tipi ve deposunun tek sütun tek boyutlu dizi olarak bütün dizisi; Bu durumda, her satırdaki öğesinin sayısının aynı olduğu (pürüzlü C# dizisi değil) bekleniyor; dizisini okurken, bu uzunluktaki öğeleri çok boyutlu dizinin ayrı satırlarına bölebilirsiniz.

+0

Demek istediğimiz, kaydedilen çok boyutlu diziyi veritabanından aldığımızda, bunu bir boyut dizisi olarak alacağız ve onu, orijinal çok boyutlu diziyi ham öğede kaydedilen ... öğelerini kullanarak değiştirecek şekilde değiştirmeliyiz ...? – Gihan

+1

Evet, çok boyutlu diziyi 'olduğu gibi' sütununa koyamaz ve geri getiremezsiniz. Çok boyutlu dizilim elde etmek için güçlü bir şekilde gerekliyse, tek boyutlu bir diziyi veritabanından alabilir ve çok boyutlu oluşturmak için C# kullanarak bunu işleyebilirsiniz. Örneğin, 5'i satırdaki bir öğe sayısı olarak depolarsanız ve depolanan dizideki toplam öğe sayısı 20 ise, her 5 öğeyi geri alınan diziden kopyalayıp satır dizisine yerleştirebilirsiniz. Sonunda [4, 5] dizisine sahip olacaksınız. – Ivan

+0

Bilgi için teşekkürler. Sahip olduğum konu budur. Ancak önceki cevaplardan sonra VARBINAY'in veri türü çelişkilerini bir şekilde ele aldığını düşündüm. Bunu uygulamaya çalışacağım ve kontrol edeceğim. Tekrar teşekkürler ..! PS (en yüksek oyu sorun) – Gihan

İlgili konular