从ado.net应用程序(MS sql提供程序)向服务器发送的sql语句

本文关键字:sql 服务器 语句 程序 net ado 应用程序 MS | 更新日期: 2023-09-27 17:58:06

我想知道从我的基于ado.net的应用程序向服务器发送了什么sql语句,用于登录异常和调试。我使用处理MS SQL连接提供程序的通用DAL。

我在搜索SO:时发现了此查询

SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC

参考:SQL Server查询跟踪

以及SO 中的许多其他

如果从SSMS(sql server Management Studio)中执行查询,则此sql代码可以捕获查询

但如果查询是从我的Ado.net应用程序发送的,并且连接了MS-sql数据库服务器,则无法捕获查询。

我的问题:

如果查询是使用此代码从基于Ado.net的应用程序发送的,为什么我无法捕获查询?

有没有其他方法(sql代码/c#代码)来捕获从我的应用程序发送的真实sql语句(就像我在sql profiler中得到的一样)

从ado.net应用程序(MS sql提供程序)向服务器发送的sql语句

如果您的DAL使用抽象的IDbConnection和IDbCommand接口,并且您有一个用于实例化IDbConnection的通用工厂,则您可以创建自己的IDbConnect实现,该实现覆盖CreateCommand以返回自己的IDb Command实现,该实现记录ExecuteReader、ExecuteNonQuery,和ExecuteScalar,然后调用真正的底层对象:

    public class MyDbConnection : IDbConnection {
        private IDbConnection src;
        public MyDbConnection(IDbConnection src) {
            this.src = src;
        }
        public IDbCommand CreateCommand() {
            return new MyDbCommand(src.CreateCommand());
        }
        //TODO create pass-through implementations of the rest of IDbConnection methods...
    }
    public class MyDbCommand : IDbCommand {
        private IDbCommand src;
        public MyDbCommand(IDbCommand src) {
            this.src = src;
        }
        public int ExecuteNonQuery() {
            log.Info(src.CommandText);
            return src.ExecuteNonQuery();
        }
        public IDataReader ExecuteReader() {
            log.Info(src.CommandText);
            return src.ExecuteReader();
        }
        public IDataReader ExecuteReader(CommandBehavior behavior) {
            log.Info(src.CommandText);
            return src.ExecuteReader(behavior);
        }
        public object ExecuteScalar() {
            log.Info(src.CommandText);
            return src.ExecuteScalar();
        }
        //TODO create pass-through implementations of the rest of IDbCommand methods and properties...
    }

现在,无论您在哪里创建IDbConnection,都要返回新的MyDbConnection(RealDbConnection)。。。

啊,对不起,我误解了这个问题。我之前的回答显示了如何捕获应用程序发送到sql客户端的内容,而不是sql客户端发送到服务器的内容。

为了捕获SQL客户端发送到服务器的SQL语句,您需要使用sp_trace_create和相关的跟踪函数来配置SQL server,以便将跟踪信息发送回您的应用程序。

这篇技术网文章可能对您有所帮助:SQL跟踪