常常遇到需要向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);
}
}
}