XMLをnvarcharに格納している場合、Dapper(またはDapper拡張機能)には、XMLをDataContractタイプまたはXmlRoot / XmlElementアノテーション付きのタイプに逆シリアル化する手段がありますか?
直接処理しない場合、これに対するイディオムはありますか?たとえば、ターゲットのDataContractクラスに、Dapperが設定しようとするプロパティがあり、そのプロパティが文字列の逆シリアル化を実行している可能性がありますか?
XMLをnvarcharに格納している場合、Dapper(またはDapper拡張機能)には、XMLをDataContractタイプまたはXmlRoot / XmlElementアノテーション付きのタイプに逆シリアル化する手段がありますか?
直接処理しない場合、これに対するイディオムはありますか?たとえば、ターゲットのDataContractクラスに、Dapperが設定しようとするプロパティがあり、そのプロパティが文字列の逆シリアル化を実行している可能性がありますか?
いいえ、現在、列名と一致する文字列プロパティに割り当てることを除いて、これで特別なことは何も試みません。今のところ、私は簡単に提案します:「データを取得する」ステップと「データをオブジェクトに逆シリアル化する」ステップを分離します。これはおそらく追加機能と見なすことができるものですが、現在存在するものではありません。
Dapperはv1.50.5(またはそれ以前のバージョン)の時点ですでにデータ型をサポートし ていると思います。データ型を、、またはに変換できます。XML
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でコードをテストしましたが、.NetFramework4.7.2以降とSystem.Data.SqlClientでも動作するはずです。
@Rickyによる回答に追加するために、XML列を含む行をデータベースに書き込む必要がある場合、このInsert
メソッドは機能していないように見え、XML列は。のままになりますNULL
。
次のスニペットはXElement
、XML列を含むテーブルにを書き込む方法を示しています。
var xElement = new XElement(...);
var newRowId = sqlConnection.QuerySingle<int>(@"
INSERT INTO MyTable (MyXmlField)
VALUES (@myXml);
SELECT SCOPE_IDENTITY();
", new { myXml = xElement });