4

C# コードからクエリに xml データ型を渡すことについて質問があります。

まず、SQL Server のテーブルを次に示します。

CREATE TABLE [dbo].[XmlTable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [dat] [xml] NOT NULL
)

次に、C# で作成されたアプリケーションがあります。そして、アプリケーションから行を挿入XmlTableします。

コードは次のとおりです。

XDocument doc = new XDocument(new XElement("root",
     new XElement("abc", "123"),
     new XElement("cba", "321")));

var reader = new XmlTextReader(new StringReader(doc.ToString()));
var xml = new SqlXml(reader);

using (var connection = new SqlConnection(_connectionString))
{
     using (var command = new SqlCommand("insert into XmlTable (dat) values(@data)", connection))
     {
          command.Parameters.Add(new SqlParameter("@data", SqlDbType.Xml){Value = xml});
          connection.Open();
          command.ExecuteNonQuery();
     }
}

すべて正常に動作し、行が挿入されます。しかし、SQL プロファイラーを実行して挿入コマンドを調べると、次のように表示されます。

declare @p3 xml
set @p3=convert(xml,N'<root><abc>123</abc><cba>321</cba></root>')
exec sp_executesql N'insert into XmlTable (dat) values(@data)',N'@data xml',@data=@p3

SqlXml型をクエリに渡しているにもかかわらず、SqlClient文字列から XML への不必要な変換が行われていることがわかります。XML パーサーは無駄な作業を行います。

問題は、なぜSqlClientこのようにするのですか? そして、どうすれば余分な変換なしでそれを行うことができますか?

4

1 に答える 1

5

現実には変換は起こりません。表示されているのは、SSMS でコピーして貼り付けて実行できる T-SQL バッチとしてTDS RPC呼び出しを何らかの方法で表現する必要がある Profiler/Trace のアーティファクトです。実行される実際のテキストは正しくinsert into XmlTable (dat) values(@data)@data型/値はParamDataリクエストの一部から取得されます。他のワイヤ プロトコルと同様に、シリアライゼーションとエンコーディングはクライアントで行われ、デコーディングとデシリアライゼーションはサーバーで行われる必要があります。補足として、sp_execute_sqlどちらにも呼び出しはありません。これは、Profiler/Trace が RPC 呼び出しを表示する方法のアーティファクトです。

このコードは高負荷のシナリオで使用され、追加の変換により遅くなります

それは憶測です。測定と観察に基づいてパフォーマンス分析を行う必要があります。

于 2012-11-29T08:46:18.293 に答える