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
このようにするのですか? そして、どうすれば余分な変換なしでそれを行うことができますか?