簡體   English   中英

從ado.net應用程序(MS SQL提供程序)發送到服務器的什么sql語句

[英]what sql statement sent to server from ado.net application (MS SQL provider)

我想知道從基於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查詢跟蹤

還有很多其他的

如果這些SQL代碼是在SSMS(SQL Server Management Studio)中執行的,則可以捕獲查詢

但是如果它們是從與MS sql數據庫服務器連接的Ado.net應用程序發送的,則無法捕獲查詢。

我的問題:

如果使用此代碼從基於Ado.net的應用程序發送查詢,為什么不能捕獲查詢?

還有其他方法(sql代碼/ c#代碼)來捕獲從我的應用程序發送的真實sql語句(例如我在sql profiller中獲得的內容)

如果您的DAL使用抽象的IDbConnection和IDbCommand接口,並且您有一個通用的實例化IDbConnection的工廠,則可以創建自己的IDbConnection實現,該實現將覆蓋CreateCommand以返回您自己的IDbCommand實現,該實現將在之前記錄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(theRealDbConnection)。

啊,對不起,我誤解了這個問題。 我之前的答案顯示了如何捕獲應用程序發送給sql客戶端的內容,而不是sql客戶端發送給服務器的內容。

為了捕獲SQL客戶端發送到服務器的SQL語句,您將需要使用sp_trace_create和相關的跟蹤函數來配置sql服務器,以將跟蹤信息發送回您的應用程序。

此technet文章可能對您有所幫助: SQL跟蹤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM