3

XMLをnvarcharに格納している場合、Dapper(またはDapper拡張機能)には、XMLをDataContractタイプまたはXmlRoot / XmlElementアノテーション付きのタイプに逆シリアル化する手段がありますか?

直接処理しない場合、これに対するイディオムはありますか?たとえば、ターゲットのDataContractクラスに、Dapperが設定しようとするプロパティがあり、そのプロパティが文字列の逆シリアル化を実行している可能性がありますか?

4

3 に答える 3

2

いいえ、現在、列名と一致する文字列プロパティに割り当てることを除いて、これで特別なことは何も試みません。今のところ、私は簡単に提案します:「データを取得する」ステップと「データをオブジェクトに逆シリアル化する」ステップを分離します。これはおそらく追加機能と見なすことができるものですが、現在存在するものではありません。

于 2012-11-11T20:27:10.780 に答える
2

Dapperはv1.50.5(またはそれ以前のバージョン)の時点ですでにデータ型をサポートし ていると思います。データ型を、、またはに変換できます。XMLXMLXmlDocumentXDocumentXElement

それは私のコードで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でも動作するはずです。

于 2019-02-12T03:47:10.430 に答える
1

@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 });
于 2022-01-14T19:09:10.117 に答える