【问题标题】:view SqlXmlCommand.ExecuteCommand() on SQL server在 SQL 服务器上查看 SqlXmlCommand.ExecuteCommand()
【发布时间】:2014-02-27 19:44:17
【问题描述】:

我遇到了一个问题,我正在查看使用 SqlXmlCommand 对象从数据库获取数据的旧应用程序。有一个 .xsd 文件,其中包含正在使用的表、哪些字段、它们的关系等。我们遇到的问题是它在大多数情况下都有效,但不是全部。我想知道是否有办法检查 Sql Server 上实际运行的内容。我没有安装 SQL 探查器,所以该选项不可用。

代码如下:

SqlXmlCommand xcmd = new SqlXmlCommand(DataAccess.OleDbConnectionString);
xcmd.CommandType = SqlXmlCommandType.XPath;
xcmd.SchemaPath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"myXsd.xsd"));
xcmd.XslPath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, String.Format(@"myXsl.xsl", ReportType)));
xcmd.CommandText = "id[@PK=$PK]";
SqlXmlParameter p = xcmd.CreateParameter();
p.Name = "@PK";
p.Value = Id;

using (Stream s = xcmd.ExecuteStream()) { ... }

这在 ExectureStream() 处发生了错误:

SQLXML: error loading XML result (XML document must have a top level element.)

我们认为有一些数据异常导致 xml 无法正确生成,这就是为什么我们想看看究竟运行了什么。

干杯

【问题讨论】:

  • 即使您没有安装 SQL Profiler,您仍然可以运行服务器端跟踪或使用扩展事件。设置这些跟踪之一可能有点棘手。当你用过一次之后,你肯定会再次使用它很多次。我认为这是值得的。

标签: c# sqlxml


【解决方案1】:

您可以尝试以下两个查询,您可能需要稍微调整一下,但为了给您一个想法,第一个为您提供所有请求的列表,第二个将通过其为您提供请求的详细信息请求 id (session_id)

SELECT *
FROM sys.dm_exec_requests

DBCC INPUTBUFFER (12345)

虽然我个人宁愿先尝试调试 C# 应用程序并查看从 VS 调试器发送到服务器的内容,然后再检查 SQL Server 上正在运行的内容

另外,DBCC INPUTBUFFER 可能会给你类似EXECUTE dbo.MyStoredProc 'params...' 的东西,以便更深入地挖掘,或者更直接的查询,你可以运行这个

SELECT r.session_id, r.[status], r.command, t.[text]
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle]) t

【讨论】:

  • 您好,谢谢您的回复。当尝试在 C# 中调试代码时,我们无法找出查询是什么。没有财产可以告诉我们。这就是为什么我试图走这条路。我会告诉你我发现了什么。
  • @ncbl 我不熟悉 SqlXmlCommand,但是上面的查询应该可以从 SQL Server 端为您提供所需的内容,只需要确保在您要调查的查询时运行它当然执行
  • 感谢这位伙伴,它最终成功了。发现正在生成的查询将字符串转换为浮点数 - 但是当我们的 PK 获得高于 100 万条记录时,它爆炸了。
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多