47

生成されたSQLをデバッグログなどにダンプする方法はありますか? 私はそれをwinformsソリューションで使用しているため、ミニプロファイラーのアイデアはうまくいきません。

4

6 に答える 6

30

同じ問題が発生し、検索を行った後にコードを実装しましたが、すぐに使用できるものはありませんでした。共有したいnuget MiniProfiler.Integrationsのパッケージがあります。

更新 V2 : 他のデータベース サーバーとの連携をサポートします。MySQL の場合、MiniProfiler.Integrations.MySqlが必要です。

以下は、SQL Server を操作する手順です。

1.接続をインスタンス化する

var factory = new SqlServerDbConnectionFactory(_connectionString);
using (var connection = ProfiledDbConnectionFactory.New(factory, CustomDbProfiler.Current))
{
 // your code
}

2.すべての作業が完了したら、必要に応じてすべてのコマンドをファイルに書き込みます

File.WriteAllText("SqlScripts.txt", CustomDbProfiler.Current.ProfilerContext.BuildCommands());
于 2015-12-16T10:33:22.333 に答える
14

現在、Dapper にはここにインストルメンテーション ポイントがありません。お気づきのように、これはおそらく、私たち (作成者として) ミニプロファイラーを使用してこれを処理しているためです。ただし、それが役立つ場合、ミニプロファイラーのコア部分は実際にはアーキテクチャに依存しないように設計されており、winform、wpf、wcf などでそれを使用している他の人を知っています。これにより、プロファイリング/トレース接続ラッパーにアクセスできます。 .

理論的には、包括的なキャプチャ ポイントを追加することは完全に可能ですが、次の 2 つの点が懸念されます。

  • (主に) セキュリティ: dapper にはコンテキストの概念がないため、dapperを経由するすべての SQL トラフィックを傍受するために、悪意のあるコードが静かにアタッチされるのは非常に簡単です私は本当にその音が好きではありません(呼び出し元が接続を所有しているため、これは「デコレータ」アプローチの問題ではありません。したがって、ロギングコンテキストです)
  • null(二次)パフォーマンス:しかし...実際には、単純なデリゲートチェック(おそらくほとんどの場合)が大きな影響を与えるとは言い難い

もちろん、他にできることは、ミニ プロファイラーから接続ラッパー コードを盗み、プロファイラー コンテキストのものを次のように置き換えることですDebug.WriteLine

于 2013-08-30T10:58:05.010 に答える
4

これは網羅的ではなく、基本的にはちょっとしたハックですが、SQL があり、パラメーターを初期化したい場合は、基本的なデバッグに役立ちます。

public static class DapperExtensions
    {
        if (args is null) throw new ArgumentNullException(nameof(args));
        public static string ArgsAsSql(this DynamicParameters args)
        {
            var sb = new StringBuilder();
            foreach (var name in args.ParameterNames)
            {
                var pValue = args.Get<dynamic>(name);

                var type = pValue.GetType();

                if (type == typeof(DateTime))
                    sb.AppendFormat("DECLARE @{0} DATETIME ='{1}'\n", name, pValue.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                else if (type == typeof(bool))
                    sb.AppendFormat("DECLARE @{0} BIT = {1}\n", name, (bool)pValue ? 1 : 0);
                else if (type == typeof(int))
                    sb.AppendFormat("DECLARE @{0} INT = {1}\n", name, pValue);
                else if (type == typeof(List<int>))
                    sb.AppendFormat("-- REPLACE @{0} IN SQL: ({1})\n", name, string.Join(",", (List<int>)pValue));
                else
                    sb.AppendFormat("DECLARE @{0} NVARCHAR(MAX) = '{1}'\n", name, pValue.ToString());
            }

            return sb.ToString();
        }
    }

その後、これをイミディエイト ウィンドウまたはウォッチ ウィンドウで使用して、SQL を取得できます。

于 2016-10-14T15:15:20.683 に答える
4

SQL Management Studio → Extras → SQL Server Profilerのメニューにある SQL プロファイラーの使用を検討する必要があります(Dapper 拡張機能は必要ありません。SQL プロファイラー ツールを入手した場合は、他の RDBMS でも動作する可能性があります)。

次に、新しいセッションを開始します。

たとえば、次のような結果が得られます (すべてのパラメーターと完全な SQL 文字列が表示されます)。

exec sp_executesql N'SELECT * FROM Updates WHERE CAST(Product_ID as VARCHAR(50)) = @appId AND (Blocked IS NULL OR Blocked = 0) 
                    AND (Beta IS NULL OR Beta = 0 OR @includeBeta = 1) AND (LangCode IS NULL OR LangCode IN (SELECT * FROM STRING_SPLIT(@langCode, '','')))',N'@appId nvarchar(4000),@includeBeta bit,@langCode nvarchar(4000)',@appId=N'fea5b0a7-1da6-4394-b8c8-05e7cb979161',@includeBeta=0,@langCode=N'de'
于 2020-01-29T03:57:59.960 に答える