首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

使用 XML 向 SQL Server 2005 批量寫入資料:解決 XML 序列化命名空間與日期格式問題

     編輯:關於SqlServer

場景

需將 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 無法正確解析。

解決方案:自訂 XmlSerializerNamespaces 移除命名空間

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved