【问题标题】:ADO.NET query not showing in XEventsADO.NET 查询未显示在 XEvents 中
【发布时间】:2019-03-01 20:17:06
【问题描述】:

我使用 PowerShell 中的 ADO.Net SqlAdapter 向 SQL Server 发送了一个查询。查询返回正确的结果。 当我使用 sqlserver.sql_statement_starting 事件运行 XEvent 会话时,来自 ADO.NET 的查询不显示。我从 SSMS 发送的查询会立即显示。

这是一个错误,还是为什么我看不到 ADO.NET 查询?

我使用的代码是

$serverName = 'localhost'
$databaseName = 'Contoso Retail DW'
$schemaName = 'dbo'
$tableName = 'FactSalesFMCG'

$connString = Get-ConnectionString -IntegratedSecurity -Server $serverName -Database $databaseName 
$sqlConn = [System.Data.SqlClient.SqlConnection]::new($connString) 
$sqlConn.Open()
$columnMetadataAdapter = Get-ColumnMetadataAdapter -Conn $sqlConn -SchemaName $schemaName -TableName $tableName
$table = [System.Data.DataTable]::new()
$columnMetadataAdapter.Fill($table)
$sqlConn.Close()

Get-ConnectionString 和 Get-ColumnMetadataAdapter 是 PowerShell 函数,可帮助创建所需的 ADO.NET 对象。表中填充了我想要的列元数据,但 SELECT 语句未显示在 XEvents 中。

【问题讨论】:

    标签: sql-server ado.net extended-events


    【解决方案1】:

    无法复制。

    CREATE EVENT SESSION [trc] ON SERVER 
    ADD EVENT sqlserver.rpc_completed,
    ADD EVENT sqlserver.sp_statement_completed,
    ADD EVENT sqlserver.sql_batch_completed,
    ADD EVENT sqlserver.sql_statement_completed
    GO
    

    开始会话并在 SSMS 中观看实时事件。

    然后

    PS C:\Users\dbrowne> $da = new-object system.data.sqlclient.sqldataadapter
    PS C:\Users\dbrowne> $con = new-object system.data.sqlclient.sqlconnection "server=.;database=tempdb;integrated security=true"
    PS C:\Users\dbrowne> $con.open()
    PS C:\Users\dbrowne> $cmd = $con.createcommand()
    PS C:\Users\dbrowne> $cmd.commandtext = "select * from sys.objects"
    PS C:\Users\dbrowne> $da.selectcommand = $cmd
    PS C:\Users\dbrowne> $dt = new-object system.data.datatable
    PS C:\Users\dbrowne> $da.fill($dt)
    106
    

    并查看 sql_statement_completed 和 sql_batch_completed(注意使用不同的代码,您可能会得到 rpc_completed 而不是 sql_batch_completed)。

    如果将参数绑定到 SqlCommand 中,它将作为 RPC 调用而不是批处理调用发送,并且事件将是 rpc/sp 而不是批处理/sql。

    rpc_completed/sp_statement_completed
    

    而不是

    sql_batch_completed/sql_statement_completed
    

    【讨论】:

    • 我试过你的代码,查询确实出现在 XEvents 中。不过我的没有。我已将我的代码添加到问题中。也许问题是我使用的是 SqlAdapter.Fill() 方法?
    • 不知道。您可能需要查看 Get-ColumnMetadataAdapter 以了解它在做什么,或者消除该调用,在我的回答中将其替换为 ADO.NET 代码的变体。
    • 该函数设置了一个 SqlDataAdapter,它将表和架构作为参数,并具有一个 SelectCommand,用于查询 DMV 以获取表的列名和数据类型。我将尝试内联该代码,看看我现在是否得到一个 XEvent。但是,最后一个 SQL 查询被发送到 SQL Server,因此它应该显示在 XEvents 中。谢谢!
    • 是的。请参阅更新以回答。参数化查询作为 RPC 调用发送。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多