常常遇到需要向SQL Server插入批量數據,然後在存儲過程中對這些數據進行進一步處理的情況。存儲過程並沒有數組、列表之類的參數類型,使用XML類型可妥善解決這個問題。
不過,SQL Server2005對標准xml的支持不足,很多地方需要特別處理。舉一個例子說明一下。
這個場景是往存儲過程裡傳遞一個xml序列化了的List<Model>。
1.Model的代碼如下,這是一個實體類
public class Model { /// <summary> /// UIN /// </summary> [XmlElement("UIN")] public long UIN { get; set; } /// <summary> /// 昵稱 /// </summary> [XmlElement("Name")] public string Name { get; set; } /// <summary> /// 頭像 /// </summary> [XmlElement("Img")] public string Img { get; set; } /// <summary> /// 訪問時間 /// </summary> [XmlElement("VisitTime")] public DateTime VisitTime { get; set; } }
然後我們需要將這個List<Model>序列化成一個xml的字符串。但是SQL Server對xml的命名空間識別是有問題的,.net默認的序列化會出現xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=http://www.w3.org/2001/XMLSchema
有網友給出了一個完美序列化Sql Server2005支持的xml的類(參考http://www.cnblogs.com/prime/archive/2012/10/11/SQLXML.html):
public static class DbXml { private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(); static DbXml() { //去掉 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Namespaces.Add(string.Empty, string.Empty); } /// <summary> /// 把一個對象序列化成一個Xml字符串 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string SerializeXml<T>(T obj) { XmlSerializer serializer = new XmlSerializer(typeof(T)); using (MemoryStream stream = new MemoryStream()) { serializer.Serialize(stream, obj, Namespaces); return Encoding.UTF8.GetString(stream.ToArray()); } } public static T DeserializeXml<T>(string obj) { XmlSerializer serializer = new XmlSerializer(typeof(T)); using (StringReader reader = new StringReader(obj)) { return (T)serializer.Deserialize(reader); } } }