如果我将 XML 存储在 nvarchar 中,Dapper(或 Dapper 扩展)是否可以将 XML 反序列化为 DataContract 类型或具有 XmlRoot / XmlElement 注释的类型?
如果它不直接处理它,是否有这样的成语?例如,也许我的目标 DataContract 类具有 Dapper 尝试设置的属性,并且该属性执行字符串的反序列化?
如果我将 XML 存储在 nvarchar 中,Dapper(或 Dapper 扩展)是否可以将 XML 反序列化为 DataContract 类型或具有 XmlRoot / XmlElement 注释的类型?
如果它不直接处理它,是否有这样的成语?例如,也许我的目标 DataContract 类具有 Dapper 尝试设置的属性,并且该属性执行字符串的反序列化?
不,目前它不会尝试对此进行任何特殊处理,除非将其分配给与列名匹配的字符串属性。现在,我建议简单地:将“获取数据”和“将数据反序列化为对象”步骤分开。这也许是可以被视为附加功能的东西,但它不是目前存在的东西。
我认为 Dapper 已经支持 XML
v1.50.5(或更早版本)的数据类型,它可以将XML
数据类型转换为XmlDocument
,XDocument
或XElement
.
它确实将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 上工作。
要添加@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 });