Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में XML सम्मिलित करते समय एन्कोडिंग त्रुटि को स्विच करने में असमर्थ कैसे हल करें?

यह प्रश्न 2 अन्य लोगों का लगभग डुप्लिकेट है, और आश्चर्यजनक रूप से - जबकि यह सबसे हाल का है - मेरा मानना ​​है कि इसमें सबसे अच्छा उत्तर नहीं है।

डुप्लीकेट, और जिन्हें मैं उनके सर्वोत्तम उत्तर मानता हूं, वे हैं:

  • XML क्रमांकन के लिए StringWriter का उपयोग करना (2009-10-14)
    • https://stackoverflow.com/a/1566154/751158
  • XML सामग्री को SQL सर्वर 2005 में संग्रहीत करने का प्रयास विफल रहता है (एन्कोडिंग समस्या) (2008-12-21)
    • https://stackoverflow.com/a/1091209/751158

अंत में, इससे कोई फर्क नहीं पड़ता कि कौन सी एन्कोडिंग घोषित या उपयोग की जाती है, जब तक कि XmlReader इसे एप्लिकेशन सर्वर के भीतर स्थानीय रूप से पार्स कर सकते हैं।

जैसा कि SQL सर्वर में XML टाइप कॉलम से ADO.net में XML को पढ़ने के लिए सबसे कुशल तरीके से पुष्टि की गई थी?, SQL सर्वर XML को एक कुशल बाइनरी प्रारूप में संग्रहीत करता है। SqlXml . का उपयोग करके क्लास, ADO.net इस बाइनरी प्रारूप में SQL सर्वर के साथ संचार कर सकता है, और डेटाबेस सर्वर को XML के किसी भी क्रमांकन या डी-सीरियलाइज़ेशन की आवश्यकता नहीं है। यह पूरे नेटवर्क में परिवहन के लिए भी अधिक कुशल होना चाहिए।

SqlXml . का उपयोग करके , एक्सएमएल को डेटाबेस में पूर्व-पार्स किया जाएगा, और फिर डीबी को कैरेक्टर एन्कोडिंग - यूटीएफ -16 या अन्यथा के बारे में कुछ भी जानने की आवश्यकता नहीं है। विशेष रूप से, ध्यान दें कि एक्सएमएल घोषणाएं डेटाबेस में डेटा के साथ भी कायम नहीं रहती हैं, भले ही इसे डालने के लिए किस विधि का उपयोग किया जाता है।

कृपया उपरोक्त लिंक किए गए उत्तरों को उन विधियों के लिए देखें जो इससे बहुत मिलती-जुलती हैं, लेकिन यह उदाहरण मेरा है:

using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using System.Xml;

static class XmlDemo {
    static void Main(string[] args) {
        using(SqlConnection conn = new SqlConnection()) {
            conn.ConnectionString = "...";
            conn.Open();

            using(SqlCommand cmd = new SqlCommand("Insert Into TestData(Xml) Values (@Xml)", conn)) {

                cmd.Parameters.Add(new SqlParameter("@Xml", SqlDbType.Xml) {
                    // Works.
                    // Value = "<Test/>"

                    // Works.  XML Declaration is not persisted!
                    // Value = "<?xml version=\"1.0\"?><Test/>"

                    // Works.  XML Declaration is not persisted!
                    // Value = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><Test/>"

                    // Error ("unable to switch the encoding" SqlException).
                    // Value = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test/>"

                    // Works.  XML Declaration is not persisted!
                    Value = new SqlXml(XmlReader.Create(new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test/>")))
                });

                cmd.ExecuteNonQuery();
            }
        }
    }
}

ध्यान दें कि मैं अंतिम (गैर-टिप्पणी नहीं) उदाहरण को "उत्पादन-तैयार" नहीं मानूंगा, लेकिन इसे संक्षिप्त और पठनीय होने के लिए छोड़ दिया। यदि ठीक से किया जाए, तो दोनों StringReader और बनाया गया XmlReader using . के भीतर प्रारंभ किया जाना चाहिए यह सुनिश्चित करने के लिए कथन कि उनका Close() . है विधियों को पूर्ण होने पर कहा जाता है।

मैंने जो देखा है, उससे एक्सएमएल कॉलम का उपयोग करते समय एक्सएमएल घोषणाएं कभी जारी नहीं रहती हैं। यहां तक ​​​​कि .NET का उपयोग किए बिना और केवल इस प्रत्यक्ष SQL सम्मिलन कथन का उपयोग किए बिना, उदाहरण के लिए, XML घोषणा डेटाबेस में XML के साथ सहेजी नहीं जाती है:

Insert Into TestData(Xml) Values ('<?xml version="1.0" encoding="UTF-8"?><Test/>');

अब ओपी के प्रश्न के संदर्भ में, क्रमबद्ध की जाने वाली वस्तु को अभी भी MyMessage से XML संरचना में परिवर्तित करने की आवश्यकता है। ऑब्जेक्ट, और XmlSerializer इसके लिए अभी भी जरूरत है। हालांकि, कम से कम, एक स्ट्रिंग को क्रमबद्ध करने के बजाय, संदेश को XmlDocument में क्रमबद्ध किया जा सकता है - जिसे बाद में SqlXml . पर पास किया जा सकता है एक नए XmlNodeReader . के माध्यम से - एक स्ट्रिंग के लिए डी-सीरियलाइज़ेशन/सीरियलाइज़ेशन ट्रिप से बचना। (विवरण और उदाहरण के लिए http://blogs.msdn.com/b/jongallant/archive/2007/01/30/how-to-convert-xmldocument-to-xmlreader-for-sqlxml-data-type.aspx देखें। ।)

यहां सब कुछ .NET 4.0 और SQL Server 2008 R2 के साथ विकसित और परीक्षण किया गया था।

कृपया व्यर्थ न करें अतिरिक्त रूपांतरणों के माध्यम से एक्सएमएल चलाकर (डी-deserializations और serializations - डोम, स्ट्रिंग्स, या अन्यथा), जैसा कि यहां और अन्य जगहों पर अन्य उत्तरों में दिखाया गया है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATETIME कॉलम के लिए रैंडम मान

  2. SQL सर्वर निष्पादन योजनाओं को कैसे पढ़ें और उनका विश्लेषण कैसे करें

  3. SQL सर्वर (T-SQL) में HTML तालिका के रूप में ईमेल क्वेरी परिणाम

  4. विंडोज़ पर SQL सर्वर कैसे स्थापित करें

  5. SQL सर्वर में VALUES क्लॉज