小编典典

为什么在传递SqlXml时SqlClient使用不必要的XML转换?

sql

我有一个关于将xml数据类型传递给C#代码查询的问题。

首先,这是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事件探查器并检查insert命令,则会看到以下内容:

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要这样做?而我该如何做而无需额外转换?


阅读 167

收藏
2021-05-23

共1个答案

小编典典

实际上没有对话发生。您所看到的是Profiler / Trace的工件,它必须以某种方式将TDSRPC调用表示为T-SQL批处理,您可以复制粘贴并在SSMS中执行。执行的
实际 文本是公正的insert into XmlTable (dat)values(@data)@data类型/值来自ParamData请求的一部分。与 任何
有线协议一样,序列化和编码必须在客户端中进行,而解码和反序列化则必须在服务器中进行。附带说明一下,没有任何一个调用sp_execute_sql,这再次是Profiler/ Trace如何显示RPC调用的构件。

此代码在高负载情况下使用,附加转换使其速度变慢

那是猜测。您应该基于测量和观察来进行性能分析。

2021-05-23