2012-07-04 20 views
6

पर बहुआयामी बाइट सरणी सहेजना मैं एक बहुउद्देशीय बाइट सरणी को SQL सर्वर डेटाबेस में सहेजना चाहता हूं।SQL सर्वर डेटाबेस

मुझे पता है कि एक बाइट सरणी को कैसे सहेजना है जो डेटाबेस में छवि रूपांतरण है। इसके लिए मैंने उपयोग किए गए डेटा प्रकार image है। लेकिन अब मैं एक और बाइट सरणी स्टोर करना चाहता हूं जो बहुआयामी बाइट सरणी byte [,] temp है, जिसमें x, y मानों के साथ दो आयाम हैं।

मैंने इंटरनेट पर खोज की और यहां कहा जाता है कि VARBINARY प्रारूप का उपयोग करना। मैं बस इतना जानना चाहता हूं कि अगर मैं VARBINARY डेटाटाइप डेटा कॉलम में अपनी बहुआयामी सरणी को सहेजता हूं, तो क्या मान बदले जाएंगे? क्या डेटा को फिर से बहुआयामी सरणी के रूप में प्राप्त करना संभव है?

+1

'IMAGE' बहिष्कृत हो गई है - ** 2005 और नए **, आप ** हमेशा ** का उपयोग करना चाहिए' VARBINARY (मैक्स) एसक्यूएल सर्वर के लिए 'किसी भी बाइनरी प्रकार के भंडारण के लिए - कि एक ही चित्र है या एक बहु आयामी सरणी। और ** नहीं ** आपका डेटा ** ** ** किसी भी तरह से बदला नहीं जाएगा - बाइट्स, बाइट्स आउट, ठीक उसी तरह जैसे आप उन्हें पहले स्थान पर रखते हैं –

+0

बहुत बढ़िया धन्यवाद .. यह वास्तव में सहायक था ... और एक और बात यह क्यों है कि आप कहते हैं कि छवि को बहिष्कृत किया गया है .. क्या IMAGE का उपयोग करने का कोई नकारात्मक पक्ष है ..? मैं एसक्यूएल सर्वर 2005 – Gihan

+1

पीएस का उपयोग कर रहा हूं: मैंने गुगल किया और जवाब मिला। एक बार फिर धन्यवाद। आशा है कि आप इसे एक उत्तर के रूप में रखें ताकि मैं इसे टिक कर सकूं। यहां के बीच जो लोग चाहते हैं उनके लिए अधिक बहिष्कृत डेटा प्रकारों का लिंक है: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/15f9e54c-18af-4f9a-8472-58fbd285a736 – Gihan

उत्तर

7

हां, आप अपने बहु-आयामी सरणी को वापस नहीं कर पाएंगे।

आप इसे कैसे कर सकते हैं? एसक्यूएल सर्वर में एक वर्बिनरी (अधिकतम) फ़ील्ड का उपयोग करके और इसमें सीरियलाइज्ड बहुआयामी बाइट सरणी को सहेजना। अपनी सरणी को वापस पाने के लिए, obviusly, आपको डेटाबेस में संग्रहीत किए गए चीज़ों को deserialize करने की आवश्यकता है।

यहाँ यह कैसे करना है की एक उदाहरण है:

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 सर्वर से संग्रह/पुनर्प्राप्ति करते हैं? मैंने सोचा कि varbinary() केवल बाइट स्वीकार करता है [] और बाइट नहीं [,]। –

+0

मैं कहूंगा कि, आयामों को जानना, एक बाइट [ए, बी] एक बाइट [ए * बी] से अधिक कुछ नहीं है ... – Kek

+0

हां, और "आयामों को जानना" यहां महत्वपूर्ण बिंदु है। SQL को varbinary (n) को बाइट में कैसे विभाजित करना चाहिए [,] (varbinary (10) बाइट [1,10], बाइट [2,5], बाइट [5,2], बाइट [10,1] हो सकता है ...)। –

2

मैं जानता हूँ कि वहाँ के रूप में Microsoft SQL सर्वर में कोई उचित डेटा प्रकार बहुआयामी सरणियों स्टोर करने के लिए है। हालांकि सरणी संरचना के बारे में जानकारी बचाने के कई तरीके हैं। उनमें से कुछ:

  1. द्विआधारी (फिक्स्ड लंबाई) डेटा प्रकार और उचित स्तंभ के लिए अपने बहुआयामी सरणी के प्रत्येक पंक्ति के कई कॉलम बना; इस मामले में यह अपेक्षा की जाती है कि आपकी सरणी में पंक्तियों की गिनती स्थिर है;

  2. दुकान VARBINARY (चर लंबाई) INT डेटा के अलग कॉलम में डेटा प्रकार और दुकान बहुआयामी सरणी के प्रत्येक पंक्ति में तत्वों की गिनती टाइप का एकल स्तंभ में एक आयामी सरणी के रूप में पूरे सरणी; इस मामले में यह उम्मीद की जाती है कि प्रत्येक पंक्ति में तत्वों की संख्या समान है (जंजीर सी # सरणी नहीं); सरणी पढ़ने पर आप इस लंबाई से तत्वों को बहु-आयामी सरणी की अलग पंक्तियों में विभाजित करने में सक्षम होंगे।

+0

तो आपका मतलब यह है कि जब हम डेटाबेस से सहेजी गई बहुआयामी सरणी को पुनर्प्राप्त करते हैं, तो हम इसे एक आयाम सरणी के रूप में प्राप्त करेंगे और हमें कच्चे में तत्वों की सहेजने वाली संख्या का उपयोग करके मूल बहुआयामी सरणी बनाने के लिए इसे बदलना होगा ..? – Gihan

+1

हां, आप बहुआयामी सरणी 'जैसा है' कॉलम में नहीं डाल सकते हैं और फिर इसे वापस पुनर्प्राप्त कर सकते हैं। यदि यह बहुआयामी सरणी प्राप्त करने के लिए दृढ़ता से आवश्यक है, तो आप डेटाबेस से एक-आयामी सरणी पुनर्प्राप्त कर सकते हैं और बहु-आयामी बनाने के लिए इसे C# का उपयोग करके संसाधित कर सकते हैं। उदाहरण के लिए, यदि आप पंक्ति में तत्वों की गिनती के रूप में 5 स्टोर करते हैं और संग्रहीत सरणी में तत्वों की कुल गणना 20 है, तो आप प्रत्येक 5 तत्वों को पुनर्प्राप्त सरणी से कॉपी करने और उन्हें पंक्ति-सरणी में रखने में सक्षम होंगे। अंत में आपके पास [4, 5] सरणी होगी। – Ivan

+0

अंतर्दृष्टि के लिए ठीक है धन्यवाद। यह मेरे पास सही मुद्दा है। लेकिन पहले के जवाबों के बाद मैंने सोचा कि वर्बीना किसी भी तरह डेटाटाइप संघर्ष को संभालता है। मैं इसे लागू करने और जांचने की कोशिश करूंगा। धन्यवाद फिर से ..! पीएस (अगर आप कर सकते हैं तो समस्या को वोट दें) – Gihan

संबंधित मुद्दे