3

如果我将 XML 存储在 nvarchar 中,Dapper(或 Dapper 扩展)是否可以将 XML 反序列化为 DataContract 类型或具有 XmlRoot / XmlElement 注释的类型?

如果它不直接处理它,是否有这样的成语?例如,也许我的目标 DataContract 类具有 Dapper 尝试设置的属性,并且该属性执行字符串的反序列化?

4

3 回答 3

2

不,目前它不会尝试对此进行任何特殊处理,除非将其分配给与列名匹配的字符串属性。现在,我建议简单地:将“获取数据”和“将数据反序列化为对象”步骤分开。这也许是可以被视为附加功能的东西,但它不是目前存在的东西。

于 2012-11-11T20:27:10.780 回答
2

我认为 Dapper 已经支持 XMLv1.50.5(或更早版本)的数据类型,它可以将XML数据类型转换为XmlDocument,XDocumentXElement.

它确实将XML数据类型转换为XElement我的代码。

2021 年 3 月 5 日的示例代码

返回 XML 类型数据的存储过程:

CREATE PROCEDURE spGetCarInformation
AS
DECLARE @Cfg XML
SET @Cfg = '<Configuration>
    <A>111</A>
    <B>222</B>
</Configuration>'

SELECT 1 AS Id, 'Test' AS Name, @Cfg AS [Configuration]

代码示例:

/* Program.cs */

using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Data.SqlClient;
using Dapper;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            /* query XML data from database */
            using var connection = new SqlConnection("Data Source=; Initial Catalog=; User ID=; Password=");
            Car car = connection.Query<Car>("EXEC spGetCarInformation").First();
            Console.WriteLine(car.Name);
            Console.WriteLine(car.Configuration.Element("A").Value);
            Console.WriteLine(car.Configuration.Element("B").Value);

            /* Insert XML data into database */
            car = new Car
            {
                Id = 2,
                Name = "New Car",
                Configuration = new XElement
                (
                    "Configuration",
                    new XElement("A", "333"),
                    new XElement("B", "444")
                )
            };

            string cmdText = @"CREATE TABLE #Car
(
    Id INT,
    Name NVARCHAR(128),
    Configuration XML
)

INSERT INTO #Car
VALUES
    (@Id, @Name, @Configuration)
    
SELECT * FROM #Car

DROP TABLE #Car";

            Car result = connection.Query<Car>(cmdText, car).First();
            Console.WriteLine(result.Name);
            Console.WriteLine(result.Configuration.Element("A").Value);
            Console.WriteLine(result.Configuration.Element("B").Value);
        }
    }

    class Car
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public XElement Configuration { get; set; }
    }
}

输出: 在此处输入图像描述

项目中添加的 Nuget 包:

<PackageReference Include="Dapper" Version="2.0.78" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.2" />

我在 .NET 5 上测试了代码,但也应该在 .Net Framework 4.7.2+ 和 System.Data.SqlClient 上工作。

于 2019-02-12T03:47:10.430 回答
1

要添加@Ricky 的答案,如果您需要将包含 XML 列的行写入数据库,该Insert方法似乎不起作用并将 XML 列保留为NULL.

以下代码段显示了如何将 anXElement写入包含 XML 列的表中:

var xElement = new XElement(...);

var newRowId = sqlConnection.QuerySingle<int>(@"
    INSERT INTO MyTable (MyXmlField)
    VALUES (@myXml);                    
    SELECT SCOPE_IDENTITY();
    ", new { myXml = xElement });
于 2022-01-14T19:09:10.117 回答