दिलचस्प पोस्ट
SQL सर्वर में एक चयन से मैं कैसे अपडेट करूं? एक छवि के लिए EXIF ​​डेटा सेट करने में समस्या केवल एसक्यूएल का उपयोग पूर्व-अपस्टैट कॉलम मान वापस – PostgreSQL संस्करण एक सर्वेक्षण के लिए डेटाबेस डिजाइन रूबी के साथ फ़ोल्डर से सभी फाइलों के नाम प्राप्त करें विजुअल स्टूडियो होस्टिंग प्रक्रिया का उद्देश्य क्या है? स्ट्रिंग के अंदर बैकस्लैश प्राप्त करें – जावास्क्रिप्ट NSArray को NSDictionary में कनवर्ट करें कई फाइलें डीजेंगो में एक ही इनपुट नाम का उपयोग कर रही हैं पाउटी का उपयोग करके विंडोज से लिनक्स पर चल रहे कमांड को स्वचालित करना पायथन में पैकेज आयात करना क्या आप HTML को पार्स करने के उदाहरण प्रदान कर सकते हैं? स्ट्रिंग में वर्ण की घटनाओं की गणना करें गतिविधि संदर्भ और अनुप्रयोग संदर्भ के बीच का अंतर LINQ से एसक्यूएल और क्रमबद्ध परिणामों पर चलने वाला कुल

एक्सएमएल सीरियललाइज़ेशन के लिए स्ट्रिंगर्राइटर का उपयोग करना

मैं वर्तमान में वस्तुओं को सीरियल करने के लिए एक आसान तरीका (सी # 3) में खोज रहा हूं।

मैंने कुछ उदाहरणों की शुरुआत की और कुछ के साथ आया:

MemoryStream memoryStream = new MemoryStream ( ); XmlSerializer xs = new XmlSerializer ( typeof ( MyObject) ); XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 ); xs.Serialize ( xmlTextWriter, myObject); string result = Encoding.UTF8.GetString(memoryStream .ToArray()); 

इस सवाल को पढ़ने के बाद मैंने खुद से पूछा, क्यों नहीं StringWriter का उपयोग? यह बहुत आसान लगता है

 XmlSerializer ser = new XmlSerializer(typeof(MyObject)); StringWriter writer = new StringWriter(); ser.Serialize(writer, myObject); serializedValue = writer.ToString(); 

एक अन्य समस्या यह थी, कि पहली बार एक्सएमएल उत्पन्न करने वाला पहला उदाहरण सिर्फ SQL सर्वर 2005 डीबी के XML कॉलम में नहीं लिख सकता था।

पहला सवाल यह है कि क्या कोई कारण है कि स्ट्रिंगवर्टर का उपयोग किसी ऑब्जेक्ट को सीरियल करने के लिए क्यों नहीं करना चाहिए, जब मुझे इसके बाद स्ट्रिंग के रूप में चाहिए? Googling के साथ मुझे StringWriter का उपयोग करते हुए कोई परिणाम नहीं मिला।

दूसरा, निश्चित रूप से: यदि आप इसे स्ट्रिंग वाइटर (जो भी कारणों से) के साथ नहीं करना चाहिए, जो एक अच्छा और सही तरीका होगा?


इसके अलावा:

जैसा कि दोनों उत्तरों से पहले ही उल्लेख किया गया था, मैं आगे डीएम समस्या में एक्सएमएल में जाऊंगा।

डेटाबेस को लिखते समय मुझे निम्नलिखित अपवाद मिला:

System.Data.SqlClient.SqlException: XML पार्सिंग: पंक्ति 1, चरित्र 38, एन्कोडिंग स्विच करने में असमर्थ

स्ट्रिंग के लिए

 <?xml version="1.0" encoding="utf-8"?><test/> 

मैंने एक्सएमएलटेक्स्टवर्टर से बनाई गई स्ट्रिंग ली और बस वहां एक्सएमएल डाल दिया। यह एक काम नहीं करता (न तो डीबी में मैनुअल प्रविष्टि के साथ)

बाद में मैंने मैनुअल प्रविष्टि (केवल INSERT लिखकर …) एन्कोडिंग = "यूटीएफ -16" के साथ की, जो कि असफल भी हो गया। एन्कोडिंग को हटाकर पूरी तरह से काम किया। उस परिणाम के बाद मैं वापस स्ट्रिंगवर्टर कोड और वॉयला पर गया – यह काम किया

समस्या: मुझे सच में क्यों नहीं समझ में आता है

ईसाई हाटर में: उन परीक्षणों के साथ मुझे यकीन नहीं है कि मुझे डीबी को लिखने के लिए यूटीएफ -16 का प्रयोग करना होगा। क्या यूटीएफ -16 (एक्सएमएल टैग) में एन्कोडिंग सेट नहीं करना चाहते हैं?

Solutions Collecting From Web of "एक्सएमएल सीरियललाइज़ेशन के लिए स्ट्रिंगर्राइटर का उपयोग करना"

जब किसी XML दस्तावेज़ को एक .NET स्ट्रिंग में सीरियल करना होता है, तो एन्कोडिंग को UTF-16 पर सेट होना चाहिए। तारों को आंतरिक रूप से यूटीएफ -16 के रूप में संग्रहित किया जाता है, इसलिए यह केवल एक ही एन्कोडिंग है जो समझ में आता है। यदि आप किसी भिन्न एन्कोडिंग में डेटा संग्रहीत करना चाहते हैं, तो आप इसके बजाय एक बाइट सरणी का उपयोग करते हैं

SQL सर्वर एक समान सिद्धांत पर काम करता है; किसी xml स्ट्रिंग में पारित किसी स्ट्रिंग को यूटीएफ -16 के रूप में एन्कोड किया जाना चाहिए। SQL सर्वर किसी भी स्ट्रिंग को अस्वीकार करेगा जहां XML घोषणा UTF-16 निर्दिष्ट नहीं करती है। यदि XML घोषणा मौजूद नहीं है, तो XML मानक के लिए यह डिफ़ॉल्ट रूप से UTF-8 की आवश्यकता है, इसलिए SQL सर्वर उस के रूप में भी अस्वीकार करेगा

इसे ध्यान में रखते हुए, रूपांतरण करने के लिए यहां कुछ उपयोगिता विधियां हैं

 public static string Serialize<T>(T value) { if(value == null) { return null; } XmlSerializer serializer = new XmlSerializer(typeof(T)); XmlWriterSettings settings = new XmlWriterSettings() { Encoding = new UnicodeEncoding(false, false), // no BOM in a .NET string Indent = false, OmitXmlDeclaration = false }; using(StringWriter textWriter = new StringWriter()) { using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) { serializer.Serialize(xmlWriter, value); } return textWriter.ToString(); } } public static T Deserialize<T>(string xml) { if(string.IsNullOrEmpty(xml)) { return default(T); } XmlSerializer serializer = new XmlSerializer(typeof(T)); XmlReaderSettings settings = new XmlReaderSettings(); // No settings need modifying here using(StringReader textReader = new StringReader(xml)) { using(XmlReader xmlReader = XmlReader.Create(textReader, settings)) { return (T) serializer.Deserialize(xmlReader); } } } 

StringWriter साथ एक समस्या यह है कि डिफ़ॉल्ट रूप से यह आपको एन्कोडिंग जो इसे विज्ञापित करने की अनुमति नहीं देता है – तो आप एक XML दस्तावेज़ को यूटीएफ -16 के रूप में अपनी एन्कोडिंग विज्ञापन दे सकते हैं, जिसका मतलब है कि आपको इसे यूटीएफ -16 के रूप में एनकोड करना होगा आप इसे एक फ़ाइल में लिखते हैं इसके साथ मेरी मदद करने के लिए एक छोटा सा वर्ग है:

 public sealed class StringWriterWithEncoding : StringWriter { public override Encoding Encoding { get; } public StringWriterWithEncoding (Encoding encoding) { Encoding = encoding; } } 

या यदि आपको केवल यूटीएफ -8 की आवश्यकता है (जो कि मुझे अक्सर जरूरत है):

 public sealed class Utf8StringWriter : StringWriter { public override Encoding Encoding => Encoding.UTF8; } 

आप अपने एक्सएमएल को डाटाबेस में क्यों नहीं सहेजा जा सका – आपको हमें इसके बारे में और ब्योरा देना होगा जब आपने कोशिश की थी, अगर आप चाहते हैं कि हम इसे निदान / तय कर सकें

सबसे पहले, पुराने उदाहरण खोजने के लिए सावधान रहें। आपको एक मिल गया है जो कि XmlTextWriter का उपयोग करता है, जो कि .NET 2.0 के रूप में नापसंद है। XmlWriter.Create इसके बजाय इस्तेमाल किया जाना चाहिए।

यहां एक वस्तु को एक XML स्तंभ में क्रमबद्ध करने का एक उदाहरण दिया गया है:

 public void SerializeToXmlColumn(object obj) { using (var outputStream = new MemoryStream()) { using (var writer = XmlWriter.Create(outputStream)) { var serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(writer, obj); } outputStream.Position = 0; using (var conn = new SqlConnection(Settings.Default.ConnectionString)) { conn.Open(); const string INSERT_COMMAND = @"INSERT INTO XmlStore (Data) VALUES (@Data)"; using (var cmd = new SqlCommand(INSERT_COMMAND, conn)) { using (var reader = XmlReader.Create(outputStream)) { var xml = new SqlXml(reader); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@Data", xml); cmd.ExecuteNonQuery(); } } } } } 
 public static T DeserializeFromXml<T>(string xml) { T result; XmlSerializerFactory serializerFactory = new XmlSerializerFactory(); XmlSerializer serializer =serializerFactory.CreateSerializer(typeof(T)); using (StringReader sr3 = new StringReader(xml)) { XmlReaderSettings settings = new XmlReaderSettings() { CheckCharacters = false // default value is true; }; using (XmlReader xr3 = XmlTextReader.Create(sr3, settings)) { result = (T)serializer.Deserialize(xr3); } } return result; } 

यह कहीं और शामिल किया गया हो सकता है, लेकिन एक्सएमएल स्रोत की एन्कोडिंग लाइन को 'यूटीएफ -16' में बदलने से एक्सएमएल को एसक्यूएल सर्वर 'एक्सएमएलडाटा प्रकार' में डाला जा सकता है।

 using (DataSetTableAdapters.SQSTableAdapter tbl_SQS = new DataSetTableAdapters.SQSTableAdapter()) { try { bodyXML = @"<?xml version="1.0" encoding="UTF-8" standalone="yes"?><test></test>"; bodyXMLutf16 = bodyXML.Replace("UTF-8", "UTF-16"); tbl_SQS.Insert(messageID, receiptHandle, md5OfBody, bodyXMLutf16, sourceType); } catch (System.Data.SqlClient.SqlException ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } } 

नतीजा यह है कि सभी XML पाठ को 'एक्सएमएल' डेटा टाइप फ़ील्ड में डाला जाता है लेकिन 'हेडर' लाइन हटा दी जाती है। परिणामस्वरूप आप जो परिणाम देख रहे हैं, वह बस है

 <test></test> 

"उत्तर दिए" प्रविष्टि में वर्णित सीरियलायज़ेशन विधि का प्रयोग लक्ष्य क्षेत्र में मूल शीर्षलेख को शामिल करने का एक तरीका है, लेकिन परिणाम यह है कि शेष XML पाठ XML <string></string> टैग में संलग्न है।

कोड में टेबल एडेप्टर दृश्य स्टूडियो 2013 "नया डेटा स्रोत जोड़ें: विज़ार्ड। का प्रयोग करके एक वर्ग स्वचालित रूप से निर्मित होता है। SQL सर्वर तालिका में फ़ील्ड के लिए विधि नक्शा सम्मिलित करने के लिए पांच पैरामीटर।