需將 List<Model> 序列化為 XML 傳遞給預存程序批量處理。SQL Server 2005 對標準 XML 命名空間支援不足,需特殊處理。
public class Model {
[XmlElement("UIN")] public long UIN { get; set; }
[XmlElement("Name")] public string Name { get; set; }
[XmlElement("Img")] public string Img { get; set; }
[XmlElement("VisitTime")] public DateTime VisitTime { get; set; }
}
<Model xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="https://www.w3.org/2001/XMLSchema">...</Model>
SQL Server 2005 無法正確解析。
public static class DbXml {
private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces();
static DbXml() {
Namespaces.Add(string.Empty, string.Empty); // 移除 xsi/xsd 命名空間
}
public static string SerializeXml<T>(T obj) {
var serializer = new XmlSerializer(typeof(T));
using (var stream = new MemoryStream()) {
serializer.Serialize(stream, obj, Namespaces);
return Encoding.UTF8.GetString(stream.ToArray());
}
}
public static T DeserializeXml<T>(string xml) {
var serializer = new XmlSerializer(typeof(T));
using (var reader = new StringReader(xml)) {
return (T)serializer.Deserialize(reader);
}
}
}
SQL Server 2005 XML 資料型別接受 ISO 8601 格式(yyyy-MM-ddTHH:mm:ss)。.NET DateTime 序列化預設即符合,無需額外處理。
CREATE PROC usp_BatchInsertModels @xmlData XML AS
BEGIN
INSERT INTO TargetTable (UIN, Name, Img, VisitTime)
SELECT
T.c.value('(UIN)[1]', 'BIGINT'),
T.c.value('(Name)[1]', 'NVARCHAR(100)'),
T.c.value('(Img)[1]', 'NVARCHAR(200)'),
T.c.value('(VisitTime)[1]', 'DATETIME')
FROM @xmlData.nodes('/ArrayOfModel/Model') AS T(c);
END