sql >> データベース >  >> RDS >> Sqlserver

SQL ServerManagementStudioでNHibernateが生成したプリペアドステートメントを実行します

    nhibernateプロファイラーでこれを実行できることは知っていますが、これは無料のツールではありません。これを行う代わりの無料の方法にも興味があります。

    http://nhprof.com/

    編集

    log4net用のカスタムアペンダーがあり、実際にSQLNHibernateが吐き出すようにフォーマットするようです。以下のブログで見ました:

    http://gedgei.wordpress.com/ 2011/09/03 / logging-nhibernate-queries-with-parameters /

    以下は、上記のブログから取得し、Guidsで動作するように変更したコードです。

    /// <summary>
    /// This log4net appender is used for outputting NHibernate sql statements in a sql management studio friendly format.
    /// This means you should be able to copy the sql output from this appender and run it directly.  Normally in the NHibernate
    /// output there is parameterized sql that must be manually edited to run it.
    /// </summary>
    public class NHibernateSqlAppender : ForwardingAppender
    {
        private const string GuidRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";
    
        protected override void Append(LoggingEvent loggingEvent)
        {
            var loggingEventData = loggingEvent.GetLoggingEventData();
    
            if (loggingEventData.Message.Contains("@p"))
            {
                StringBuilder messageBuilder = new StringBuilder();
    
                string message = loggingEventData.Message;
                var queries = Regex.Split(message, @"command\s\d+:");
    
                foreach (var query in queries)
                    messageBuilder.Append(ReplaceQueryParametersWithValues(query));
    
                loggingEventData.Message = messageBuilder.ToString();
            }
    
            base.Append(new LoggingEvent(loggingEventData));
        }
    
        public static string ReplaceQueryParametersWithValues(string query)
        {
            string returnQuery = Regex.Replace(query, @"@p\d+(?=[,);\s])(?!\s*=)", match =>
            {
                Regex parameterValueRegex = new Regex(string.Format(@".*{0}\s*=\s*(.*?)\s*[\[].*", match));
                return parameterValueRegex.Match(query).Groups[1].ToString();
            });
    
            //Place single quotes around all Guids in the sql string
            returnQuery = Regex.Replace(returnQuery, GuidRegex, "'$0'", RegexOptions.IgnoreCase);
    
            int parameterListIndex = returnQuery.LastIndexOf("@p0");
    
            if (parameterListIndex != -1)
            {
                //Truncate the paramter list off the end since we are substituting the actual values in the regular expression above
                //The -1 also cuts off the semicolon at the end
                return returnQuery.Substring(0, parameterListIndex).Trim();
            }
    
            return returnQuery.Trim();
        }
    }
    

    この出力をコンソールに送信する方法は次のとおりです。

    <appender name="NHibernateSqlAppender" type="NHibernatePlayground.Custom.NHibernateSqlAppender, NHibernatePlayground">
        <appender-ref ref="console" />
    </appender>
    
    <root>
        <appender-ref ref="NHibernateSqlAppender" />
    </root>
    

    注:

    これにより、本番システムでかなり重大なパフォーマンスの問題が発生するようです。これを行うためのより良い方法はまだ見つかりませんが、これを使用する人はこれらのパフォーマンスの問題に注意してください



    1. JPA/EclipseLinkを使用して永続化をカスケードする方法

    2. MYSQLインポート:GEOMETRYフィールドに送信したデータからジオメトリオブジェクトを取得できません

    3. PictureBox画像をSQLServerデータベースに挿入します

    4. CASEを使用したSQLクエリとgroupby